原表數據:
期望結果:
使用STUFF + FOR XML PATH即可實現以上效果
執行以下SQL:
SELECT DISTINCT Name, STUFF((SELECT ',' + Course FROM Student WHERE Name = T.Name FOR XML PATH('')), 1, 1, '') AS Course FROM Student AS T
可以看到輸出結果與期望結果相同:
STUFF語法
STUFF ( character_expression , start , length , replaceWith_expression )
參數
character_expression
字符數據的表達式。 character_expression 可以是常量、變量,也可以是字符列或二進制數據列。
start
一個整數值,指定刪除和插入的開始位置。 如果 start 為負或為零,則返回空字符串。 如果 start 的長度大於第一個 character_expression,則返回空字符串。 start 的類型可以是 bigint。
length
一個整數,指定要刪除的字符數。 如果 length 為負,則返回空字符串。 如果 length 的長度大於第一個 character_expression,則最多可以刪除到最后一個 character_expression 中的最后一個字符。 如果 length 為零,則在字符串中第一個字符之前插入內容。 length 的類型可以是 bigint。
replaceWith_expression
字符數據的表達式。 character_expression 可以是常量、變量,也可以是字符列或二進制數據列。 此表達式從 start 開始替換 length 個字符的 character_expression。 如果 replaceWith_expression 為 NULL
,則在不插入任何內容的情況下刪除字符。
FOR XML PATH
其實FOR XML PATH就是將查詢結果集以XML形式展現,有了它我們可以簡化查詢語句以實現一些以前需要借助函數活存儲過程才能完成的工作。以上面的表格為例,執行以下SQL:
SELECT * FROM Student FOR XML PATH
結果如下:
執行以下SQL:
SELECT * FROM Student FOR XML PATH('')
結果如下:
由此可以看出 FOR XML PATH 可以將查詢結果根據行輸出成XML格式。