昨天在写语句的时候,遇到了一个现象,其实就是使用 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 返回的更多相关文章

  1. sqlserver xml转表 及(cross apply与outer apply)

    一. 需求是需要把','分割的字符串转为表,便于做关联查询,于是发现可以通过xml转为表,如下: declare @XXX xml set @XXX = ' <v> <aa>1 ...

  2. SQLServer中的cross apply和FOR XML PATH

    参考: FOR XML PATH:http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html cross apply:http ...

  3. (1.3)DML增强功能-Apply、pivot、unpivot、for xml path行列转换

    深入了解行列转换请参考另一篇文章:https://www.cnblogs.com/gered/p/9271581.html 总结: 1.apply一般形式 --基本形式 SELECT a FROM d ...

  4. sql server 使用for xml path 将1列多行转换为字符串连接起来,俗称 sql 合并字符

    由于项目的原因,需要将一些记录分类汇总,但还要列出相关的明细,这样的需求我还是第一次遇到,蛋疼了,还是请求一下度娘吧.搜索一番还是有结果,请看以下例子: create table tb ([id] i ...

  5. sql server 使用for xml path 将1列多行转换为字符串连接起来

    create table tb ([id] )) insert into tb ,'aa' union all ,'bb' union all ,'cc' union all ,'dd' union ...

  6. SQL Server 2008 R2——CROSS APPLY 根据数据出现的次数和时间来给新字段赋值

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  7. SQL 关于apply的两种形式cross apply 和 outer apply

    SQL 关于apply的两种形式cross apply 和 outer apply 例子: CREATE TABLE [dbo].[Customers]( ) COLLATE Chinese_PRC_ ...

  8. SQL Server 关于CROSS APPLY 和 OUTER APPLY应用

    先看看语法: <left_table_expression>  {cross|outer} apply<right_table_expression> 再让我们了解一下appl ...

  9. Entity framewok 如何实现多条记录作为一条取出, for xml path如何实现

    http://www.myexception.cn/linq/1288046.html Entity framewok 怎么实现多条记录作为一条取出, for xml path怎么实现News表:ID ...

随机推荐

  1. Adb connection Error:远程主机强迫关闭了一个现有的连接

    在用手机调试程序时,有时会出现“Adb connection Error:远程主机强迫关闭了一个现有的连接”的错误. 出现这种错误时,可以按照以下步骤解决: (1)运行cmd.exe,并将目录CD到\ ...

  2. 献给广大it从业人士:早睡早起,晚睡也早起

    早睡早起占人体健康的百分之七十:心态.饮食.及时调理各占百分之十,我们就可以知道早睡早起的重要性. 我们白天是放电,晚上睡觉是充电.晚上只冲了50%的电,白天还要释放100%,那50%哪来的?就是从五 ...

  3. cnodejs社区论坛4--话题列表

  4. 已解决:Ubuntu php gettext 无效

    使用gettext做多文字国际化,按PHP官方文档,在CentOS上OK,在Ubuntu上不行,调试了快1天,试了网上提供的无数方法,终于有一个OK了…… 看到此文的同学别再被坑了…… 感谢:http ...

  5. jQuery+turn.js翻书、文档和杂志3种特效演示

    很好用的一款插件jQuery+turn.js翻书.文档和杂志3种特效演示 在线预览 下载地址 实例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  6. 很实用的baguetteBox.js 图片弹出层

    lightbox JS插件--baguetteBox.js,它是用纯Javascript创建的图像展示效果,拥有图像放大缩小并带有相应的CSS3过度,并能在触摸屏等设备上完美展示. baguetteB ...

  7. C# 如何实现带消息数的App图标

    上次写了一篇博文,但是每次更新图标时,桌面会闪烁(刷新),有博友说人家的图标都不会刷新,还能动画.我想了一下,如果要达到这个效果,可以用Form来实现,就是在Form中嵌入一个图片,然后用一个labe ...

  8. go语言选择语句 switch case

    根据传入条件的不同,选择语句会执行不同的语句.下面的例子根据传入的整型变量i的不同而打印不同的内容: switch i { case 0: fmt.Printf("0") case ...

  9. sap去除后缀0方法

    原贴地址:http://fuhesap.com/SAP/179.html SHIFT str LEFT DELETING LEADING '0'.如果要在layout显示不出前面的0 格式: & ...

  10. 为ListView组件加上快速滑块以及修改快速滑块图像

    本文转载自:http://blog.csdn.net/ouyang_peng/article/details/46919723 作者:欧阳鹏  欢迎转载,与人分享是进步的源泉! 转载请保留原文地址:h ...