Sql server 使用STUFF在SQL中返回多个XML值
我在表的一列中有以下XML值Sql server 使用STUFF在SQL中返回多个XML值,sql-server,xml,Sql Server,Xml,我在表的一列中有以下XML值 <wizard id="CF510D2B-BF9C-485B-9D33-0056D1DDFDF2" step="4" sbm="1C766093-633D-E611-80C2-40F2E9DD0D2A"> <reviews> <crd id="AE7F8E74-643D-E611-80C2-40F2E9DD0D2A" /> <rvw id="AF7F8E74-643D-E611-80C2-40F2E9DD0D
<wizard id="CF510D2B-BF9C-485B-9D33-0056D1DDFDF2" step="4" sbm="1C766093-633D-E611-80C2-40F2E9DD0D2A">
<reviews>
<crd id="AE7F8E74-643D-E611-80C2-40F2E9DD0D2A" />
<rvw id="AF7F8E74-643D-E611-80C2-40F2E9DD0D2A" />
<rvw id="B07F8E74-643D-E611-80C2-40F2E9DD0D2A" />
</reviews>
</wizard>
输出:
AF7F8E74-643D-E611-80C2-40F2E9DD0D2A
期望输出:
AF7F8E74-643D-E611-80C2-40F2E9DD0D2A,B07F8E74-643D-E611-80C2-40F2E9DD0D2A
问题是
[1]
仅获取第一个匹配项,因为您正在使用值
函数。您可以将节点
函数与值
一起使用,将值与您启动的技术连接起来
SELECT abc = STUFF((
SELECT ',' + CONVERT(VARCHAR(50), Review.value('@id', 'uniqueidentifier'))
FROM dbo.Wizard w
CROSS APPLY w.[State].nodes('/wizard/reviews/rvw') Reviews (Review)
WHERE Code = '1C766093-633D-E611-80C2-40F2E9DD0D2A'
FOR XML PATH('')), 1, 1, '')
下面是一个功能完整的示例,如果它有帮助的话,因为我在上面的代码中假设了您的表和所需的输出:
DECLARE @Wizard TABLE (Code UNIQUEIDENTIFIER, [State] XML)
INSERT @Wizard VALUES ('1C766093-633D-E611-80C2-40F2E9DD0D2A',
'<wizard id="CF510D2B-BF9C-485B-9D33-0056D1DDFDF2" step="4" sbm="1C766093-633D-E611-80C2-40F2E9DD0D2A">
<reviews>
<crd id="AE7F8E74-643D-E611-80C2-40F2E9DD0D2A" />
<rvw id="AF7F8E74-643D-E611-80C2-40F2E9DD0D2A" />
<rvw id="B07F8E74-643D-E611-80C2-40F2E9DD0D2A" />
</reviews>
</wizard>')
DECLARE @Text VARCHAR(MAX) = STUFF((
SELECT ',' + CONVERT(VARCHAR(50), Review.value('@id', 'uniqueidentifier'))
FROM @Wizard w
CROSS APPLY w.[State].nodes('/wizard/reviews/rvw') Reviews (Review)
WHERE Code = '1C766093-633D-E611-80C2-40F2E9DD0D2A'
FOR XML PATH('')), 1, 1, '')
SELECT @Text
DECLARE@Wizard表(代码唯一标识符,[State]XML)
插入@Wizard值('1C766093-633D-E611-80C2-40F2E9DD0D2A',
'
')
声明@Text VARCHAR(MAX)=STUFF((
选择“,”+CONVERT(VARCHAR(50),Review.value(“@id”,“uniqueidentifier”))
来自@Wizard w
交叉应用w.[State]。节点('/wizard/reviews/rvw')审阅(审阅)
其中代码='1C766093-633D-E611-80C2-40F2E9DD0D2A'
对于XML路径(“”),1,1,“”)
选择@Text
是,[1]只获取第一个。我一直在查询中使用[1]。当我尝试[2]时,它得到了第二个匹配。但我不知道如何获得多个值。选择查询正是我要找的!谢谢你的帮助。:)
DECLARE @Wizard TABLE (Code UNIQUEIDENTIFIER, [State] XML)
INSERT @Wizard VALUES ('1C766093-633D-E611-80C2-40F2E9DD0D2A',
'<wizard id="CF510D2B-BF9C-485B-9D33-0056D1DDFDF2" step="4" sbm="1C766093-633D-E611-80C2-40F2E9DD0D2A">
<reviews>
<crd id="AE7F8E74-643D-E611-80C2-40F2E9DD0D2A" />
<rvw id="AF7F8E74-643D-E611-80C2-40F2E9DD0D2A" />
<rvw id="B07F8E74-643D-E611-80C2-40F2E9DD0D2A" />
</reviews>
</wizard>')
DECLARE @Text VARCHAR(MAX) = STUFF((
SELECT ',' + CONVERT(VARCHAR(50), Review.value('@id', 'uniqueidentifier'))
FROM @Wizard w
CROSS APPLY w.[State].nodes('/wizard/reviews/rvw') Reviews (Review)
WHERE Code = '1C766093-633D-E611-80C2-40F2E9DD0D2A'
FOR XML PATH('')), 1, 1, '')
SELECT @Text