[英]Concatenate/aggregate strings with JSON in SQL Server
對於那些在 SQL Server 中使用 JSON 有經驗的人來說,這可能是一個簡單的問題。 我在這里找到了這種使用FOR XML
聚合字符串的有趣方法。
create table #t (id int, name varchar(20))
insert into #t
values (1, 'Matt'), (1, 'Rocks'), (2, 'Stylus')
select id
,Names = stuff((select ', ' + name as [text()]
from #t xt
where xt.id = t.id
for xml path('')), 1, 2, '')
from #t t
group by id
如何使用JSON
而不是XML
來做同樣的事情?
您不能用 JSON 替換 XML 方法。 由於某些 XML 內部特性(在 JSON 中是不同的),因此字符串連接有效。
從 SQL Server 2017 開始,您可以使用STRING_AGG()
,但對於早期版本,XML 方法是STRING_AGG()
的方法。
首先提示:您顯示的代碼對於 XML 特殊字符不安全。 在下面檢查我的示例。
首先我聲明一個簡單的 XML
DECLARE @xml XML=
N'<a>
<b>1</b>
<b>2</b>
<b>3</b>
<c>
<d>x</d>
<d>y</d>
<d>z</d>
</c>
</a>';
——XPath .
告訴 XML 引擎使用當前節點(以及所有節點)
--因此這將返回 XML 中的任何內容
SELECT @xml.value('.','varchar(100)')
--可以指定獲取123或xyz的路徑
SELECT @xml.query('/a/b').value('.','varchar(100)')
SELECT @xml.query('//d').value('.','varchar(100)')
現在您連接表格數據的問題:
DECLARE @tbl TABLE(SomeString VARCHAR(100));
INSERT INTO @tbl VALUES('This'),('will'),('concatenate'),('magically'),('Forbidden Characters & > <');
-- 簡單的FOR XML
查詢將用<SomeString>
標記列,用<row>
標記每一行:
SELECT SomeString FROM @tbl FOR XML PATH('row');
--但是我們可以在沒有任何標簽的情況下創建相同的內容:
--注意:仔細觀察,即使沒有標簽,結果也是 XML 類型的,看起來像 SSMS 中的超鏈接。
SELECT SomeString AS [*] FROM @tbl FOR XML PATH('');
--現在我們可以在周圍查詢中用作子選擇。
-- 結果以 string形式返回,不再是 XML 類型了...看看禁止的字符!
SELECT
(SELECT SomeString FROM @tbl FOR XML PATH('row'))
,(SELECT SomeString AS [*] FROM @tbl FOR XML PATH(''))
-- 我們可以使用,TYPE
來強制子選擇被視為 XML 類型本身
-- 這允許使用.query()
和/或.value()
SELECT
(SELECT SomeString FROM @tbl FOR XML PATH('row'),TYPE).query('data(//SomeString)').value('.','nvarchar(max)')
,(SELECT SomeString AS [*] FROM @tbl FOR XML PATH(''),TYPE).value('.','nvarchar(max)')
XQuery 的.data()
可用於連接命名元素,中間有空格。
XQuery 的.value()
必須用於重新轉義禁用字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.