使用For XML PATH 会影响Cross Apply 返回
昨天在写语句的时候,遇到了一个现象,其实就是使用 Cross Apply做一个拼接字符串的而已。比如
CREATE TABLE GoodsCatalog
(ID INT,
Name NVARCHAR(50)) CREATE TABLE Goods
(ID INT,
GoodsCatalogID INT,
Name NVARCHAR(50)) INSERT INTO GoodsCatalog
( ID, Name )
VALUES ( 1,'水果'),( 2,'体育用品') INSERT INTO Goods
( ID,GoodsCatalogID, Name )
VALUES (1,1,'苹果')
,(2, 1,'香蕉')
,(3, 2,'足球')
,(4, 2,'篮球') SELECT a.*,
STUFF(B.GoodName,1,1,'') AS GoodName
FROM GoodsCatalog a
CROSS APPLY (SELECT '-' + b.Name
FROM Goods b
WHERE b.GoodsCatalogID = a.ID FOR XML PATH('')) AS B(GoodName) /*
ID Name GoodName
1 水果 苹果-香蕉
2 体育用品 足球-篮球
*/
很平常是吧?但是如果在 GoodsCatalog 表里面添加多2条数据呢?就会变成这样了。明明说好的 Cross Apply会将不返回生成结果集的行喔!!为啥还会这样呢!?
INSERT INTO GoodsCatalog
( ID, Name )
VALUES ( 3,'海鲜'),( 4,'衣服') SELECT a.*,
STUFF(B.GoodName,1,1,'') AS GoodName
FROM GoodsCatalog a
CROSS APPLY (SELECT '-' + b.Name
FROM Goods b
WHERE b.GoodsCatalogID = a.ID FOR XML PATH('')) AS B(GoodName)
/*
ID Name GoodName
1 水果 苹果-香蕉
2 体育用品 足球-篮球
3 海鲜 NULL
4 衣服 NULL */
-------------------------------------------这是描述我是一个逗比的分割线--------------------------------------------------------------------------------------------------------------
重新看了下联机文档里面的Apply 的用法
使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。
就是说,无论是 Cross Apply 还是 Outer Apply 后面都是跟随一个表值函数,会与左边的输入表每一行进行交叉。所以是否返回应该看 ()里面的语句本身。
这里我又有疑问了,Goods 表里面没有 3,4 的结果啊,为什么还能显示。
这个就是函数的问题了。假如写2个表值函数对比一下就很清晰了
CREATE FUNCTION TestXML
(@GoodsCatalogID INT)
RETURNS @TABLE TABLE
(
GoodName varchar(200)
)
AS
begin
;WITH CTE(GoodName) AS
(SELECT '-' + Name FROM Goods
WHERE GoodsCatalogID = @GoodsCatalogID FOR XML PATH(''))
INSERT INTO @TABLE (GoodName)
SELECT GoodName
FROM CTE
RETURN
END CREATE FUNCTION TestTable
(@GoodsCatalogID INT)
RETURNS @TABLE TABLE
(
GoodName varchar(200)
)
AS
begin
INSERT INTO @TABLE (GoodName)
SELECT Name FROM Goods
WHERE GoodsCatalogID = @GoodsCatalogID
RETURN
END SELECT *
FROM dbo.TestXML(3) /*
GoodName
NULL
*/ SELECT *
FROM dbo.TestTable(3) /*
GoodName
*/
一个有返回,另外一个没有返回哦~~这个就知道为什么能交叉到值出来了吧。
--------------------------------------------------------------------------------------这是证明我不认真的打脸分割线------------------------------------------------------------------------------------------------------------------------
发现了这个问题,纯粹是因为对 Apply用法不清晰导致了……╮(╯_╰)╭~
为大家献丑了
使用For XML PATH 会影响Cross Apply 返回的更多相关文章
- sqlserver xml转表 及(cross apply与outer apply)
一. 需求是需要把','分割的字符串转为表,便于做关联查询,于是发现可以通过xml转为表,如下: declare @XXX xml set @XXX = ' <v> <aa>1 ...
- SQLServer中的cross apply和FOR XML PATH
参考: FOR XML PATH:http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html cross apply:http ...
- (1.3)DML增强功能-Apply、pivot、unpivot、for xml path行列转换
深入了解行列转换请参考另一篇文章:https://www.cnblogs.com/gered/p/9271581.html 总结: 1.apply一般形式 --基本形式 SELECT a FROM d ...
- sql server 使用for xml path 将1列多行转换为字符串连接起来,俗称 sql 合并字符
由于项目的原因,需要将一些记录分类汇总,但还要列出相关的明细,这样的需求我还是第一次遇到,蛋疼了,还是请求一下度娘吧.搜索一番还是有结果,请看以下例子: create table tb ([id] i ...
- sql server 使用for xml path 将1列多行转换为字符串连接起来
create table tb ([id] )) insert into tb ,'aa' union all ,'bb' union all ,'cc' union all ,'dd' union ...
- SQL Server 2008 R2——CROSS APPLY 根据数据出现的次数和时间来给新字段赋值
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- SQL 关于apply的两种形式cross apply 和 outer apply
SQL 关于apply的两种形式cross apply 和 outer apply 例子: CREATE TABLE [dbo].[Customers]( ) COLLATE Chinese_PRC_ ...
- SQL Server 关于CROSS APPLY 和 OUTER APPLY应用
先看看语法: <left_table_expression> {cross|outer} apply<right_table_expression> 再让我们了解一下appl ...
- Entity framewok 如何实现多条记录作为一条取出, for xml path如何实现
http://www.myexception.cn/linq/1288046.html Entity framewok 怎么实现多条记录作为一条取出, for xml path怎么实现News表:ID ...
随机推荐
- Java中用户界面布局
绝对布局Absolute 通过放大或缩小界面的时候,组件大小和位置不会发生变化 浮动布局FlowLayout 调整应用程序窗口的大小时,组件将立刻重新排列 边界布局Border Layout 该位置有 ...
- mybaits 框架运用
支持普通 SQL 查询,存储过程和高级映射的ORM持久层框架.以一 个 SqlSessionFactory 对象的实例为核心. 从 XML 中构建 SqlSessionFactory configur ...
- ImFire即时通讯系统构建(需求)
ImFire需求 一期需求(近期) 1.新用户(账号)注册. 2.用户登入登出,支持pc端,移动端同时登录. 3.获取好友列表,包含好友的各种信息,状态. 4.根据用户id或用户名申请添加好友. 5. ...
- Intense Images – 全屏浏览图像的 JS 插件
Intense Images 是一个独立的 JavaScript 库,用于查看全屏图像.使用触摸/鼠标来实现图片位置的平移.图像元素的所有样式都是可以自定义的,Intense.js 只处理图像浏览器和 ...
- ScrollMe – 在网页中加入各种滚动动画效果
ScrollMe 是一款 jQuery 插件,用于给网页添加简单的滚动效果.当你向下滚动页面的时候,ScrollMe 可以缩放,旋转和平移页面上的元素.它易于设置,不需要任何自定义的 JavaScri ...
- 异常之Tomcat7.0服务器无法发布项目
今天突然就不能发布tomcat 7.0服务器了,并弹出对话框,报出如下错误: Cannot acquire J2EEFlexProjDeployable object for module test ...
- 高性能javascript学习笔记系列(3) -DOM编程
参考 高性能javascript 文档对象模型(DOM)是独立于语言的,用于操作XML和HTML文档的程序接口API,在浏览器中主要通过DOM提供的API与HTML进行交互,浏览器通常会把DOM和ja ...
- HTML <base> 标签 为页面上的所有链接规定默认地址或默认目标
定义和用法 <base> 标签为页面上的所有链接规定默认地址或默认目标. 通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白. 使用 <base& ...
- ABAP中的Table Control编程
SAP中,Table Control是在Screen中用的最广泛的控件之一了,可以实现对多行数据的编辑. 简单来说,Table Control是一组屏幕元素在Screen上的重 ...
- OC笔记
self的概念:指向了当前对象(方法的调用者) self的用途 可以利用 self -> 成员变量名 访问当前对象内部的成员变量 [self 方法名]; 调用其他对象方法或者类方法 所有继 ...