簡體   English   中英

在 SQL Server 中使用 JSON 連接/聚合字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM