从 Table 列中存在的 XML 节点检索多条记录
Retrieve multiple records from an XML Node present in the Table Column
我正在尝试检索特定 XML 节点中存在的所有 GUID。 XML 已存储在 table 的列中。这是它的样子
<ArrayOfString>
<string>52ddf406-00d9-v029-d748-2ee6958bdc95</string>
<string>8902ce52-00d9-vda9-afe9-0b3fa35f88b2</string>
<string>8902ce52-00d9-v919-0cb5-0b3fa1672fb3</string>
<string>8902ce52-00d9-v064-8e24-0b401390a1a7</string>
</ArrayOfString>
这就是我想要做的
SELECT ID, Cats = XC.value('(string)[1]', 'varchar(50)')
FROM TableName
CROSS APPLY CAST(TableName AS XML).nodes('/ArrayOfString/string') AS XT(XC)
我收到以下错误
Incorrect syntax near the keyword 'AS'.
我能够检索任何特定记录。但不是一次所有记录。
您已经有了 <string>
节点,所以您不想进一步查询它。而是查询节点的唯一元素。
(您获取节点的语法有点不对)。
declare @Test table (id int, data xml);
insert into @Test (id, data)
values (1,'<ArrayOfString>
<string>52ddf406-00d9-v029-d748-2ee6958bdc95</string>
<string>8902ce52-00d9-vda9-afe9-0b3fa35f88b2</string>
<string>8902ce52-00d9-v919-0cb5-0b3fa1672fb3</string>
<string>8902ce52-00d9-v064-8e24-0b401390a1a7</string>
</ArrayOfString>');
SELECT ID, Cats = XT.XC.value('text()[1]', 'varchar(50)')
FROM @Test T
CROSS APPLY T.data.nodes('/ArrayOfString/string') AS XT (XC);
Returns
ID
Cats
1
52ddf406-00d9-v029-d748-2ee6958bdc95
1
8902ce52-00d9-vda9-afe9-0b3fa35f88b2
1
8902ce52-00d9-v919-0cb5-0b3fa1672fb3
1
8902ce52-00d9-v064-8e24-0b401390a1a7
如果您使用的是 SQL Server 2017+:
,请使用 string_agg
获取单行(每个 ID)
SELECT T.ID, string_agg(XT.XC.value('text()[1]', 'varchar(50)'), ',') Cats
FROM @Test T
CROSS APPLY T.data.nodes('/ArrayOfString/string') AS XT (XC)
GROUP BY T.ID;
Returns:
id
Cats
1
'52ddf406-00d9-v029-d748-2ee6958bdc95,8902ce52-00d9-vda9-afe9-0b3fa35f88b2,8902ce52-00d9-v919-0cb5-0b3fa1672fb3,8902ce52-00d9-v064-8e24-0b401390a1a7'
我正在尝试检索特定 XML 节点中存在的所有 GUID。 XML 已存储在 table 的列中。这是它的样子
<ArrayOfString>
<string>52ddf406-00d9-v029-d748-2ee6958bdc95</string>
<string>8902ce52-00d9-vda9-afe9-0b3fa35f88b2</string>
<string>8902ce52-00d9-v919-0cb5-0b3fa1672fb3</string>
<string>8902ce52-00d9-v064-8e24-0b401390a1a7</string>
</ArrayOfString>
这就是我想要做的
SELECT ID, Cats = XC.value('(string)[1]', 'varchar(50)')
FROM TableName
CROSS APPLY CAST(TableName AS XML).nodes('/ArrayOfString/string') AS XT(XC)
我收到以下错误
Incorrect syntax near the keyword 'AS'.
我能够检索任何特定记录。但不是一次所有记录。
您已经有了 <string>
节点,所以您不想进一步查询它。而是查询节点的唯一元素。
(您获取节点的语法有点不对)。
declare @Test table (id int, data xml);
insert into @Test (id, data)
values (1,'<ArrayOfString>
<string>52ddf406-00d9-v029-d748-2ee6958bdc95</string>
<string>8902ce52-00d9-vda9-afe9-0b3fa35f88b2</string>
<string>8902ce52-00d9-v919-0cb5-0b3fa1672fb3</string>
<string>8902ce52-00d9-v064-8e24-0b401390a1a7</string>
</ArrayOfString>');
SELECT ID, Cats = XT.XC.value('text()[1]', 'varchar(50)')
FROM @Test T
CROSS APPLY T.data.nodes('/ArrayOfString/string') AS XT (XC);
Returns
ID | Cats |
---|---|
1 | 52ddf406-00d9-v029-d748-2ee6958bdc95 |
1 | 8902ce52-00d9-vda9-afe9-0b3fa35f88b2 |
1 | 8902ce52-00d9-v919-0cb5-0b3fa1672fb3 |
1 | 8902ce52-00d9-v064-8e24-0b401390a1a7 |
如果您使用的是 SQL Server 2017+:
,请使用string_agg
获取单行(每个 ID)
SELECT T.ID, string_agg(XT.XC.value('text()[1]', 'varchar(50)'), ',') Cats
FROM @Test T
CROSS APPLY T.data.nodes('/ArrayOfString/string') AS XT (XC)
GROUP BY T.ID;
Returns:
id | Cats |
---|---|
1 | '52ddf406-00d9-v029-d748-2ee6958bdc95,8902ce52-00d9-vda9-afe9-0b3fa35f88b2,8902ce52-00d9-v919-0cb5-0b3fa1672fb3,8902ce52-00d9-v064-8e24-0b401390a1a7' |