麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > XML > 正文

使用For XML PATH 會影響Cross Apply 返回

2024-07-21 02:48:14
字體:
來源:轉載
供稿:網友
使用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    GoodName1    水果    蘋果-香蕉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    GoodName1    水果    蘋果-香蕉2    體育用品    足球-籃球3    海鮮    NULL4    衣服    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    RETURNENDCREATE FUNCTION TestTable(@GoodsCatalogID INT)RETURNS @TABLE TABLE(    GoodName varchar(200))AS    begin    INSERT INTO @TABLE (GoodName)    SELECT  Name FROM Goods        WHERE GoodsCatalogID = @GoodsCatalogID    RETURNENDSELECT *    FROM dbo.TestXML(3)/*GoodNameNULL*/SELECT *     FROM dbo.TestTable(3)/*GoodName*/

一個有返回,另外一個沒有返回哦~~這個就知道為什么能交叉到值出來了吧。

--------------------------------------------------------------------------------------這是證明我不認真的打臉分割線------------------------------------------------------------------------------------------------------------------------

發現了這個問題,純粹是因為對 Apply用法不清晰導致了……╮(╯_╰)╭~

為大家獻丑了


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久99国产综合精品 | 久久逼网 | 精国品产一区二区三区有限公司 | 99精品视频在线看 | 日本在线不卡一区二区 | 成人在线观看免费观看 | 亚洲国产网站 | 黄色特级毛片 | 蜜桃视频网站在线观看 | 91久久国产综合久久91猫猫 | 久久精品一二三区白丝高潮 | 亚州精品天堂中文字幕 | 日本成人高清视频 | 日本黄色大片免费 | 久久精品视频一区 | 久久久一区二区三区精品 | 一级毛片手机在线观看 | 国产精品久久久免费观看 | 亚洲码无人客一区二区三区 | 本色视频aaaaaa一级网站 | 欧美视频99| 黄色av免费网站 | 欧美一级做一级爱a做片性 91在线视频观看 | 羞羞视频免费网站男男 | av在线收看| 国产精品视频自拍 | 黄色网址你懂的 | 在线播放免费播放av片 | 中文字幕免费一区 | 国产高清自拍一区 | 午夜色视频在线观看 | 黄色免费不卡视频 | 18欧美性xxxx极品hd | 91 在线免费观看 | 中文字幕在线观看视频一区 | 亚洲乱码精品久久久久 | 国产毛片在线看 | asian gaysex| 成人爱爱电影 | 黄色一级毛片免费看 | 欧美一级免费在线观看 |