TSQL在where子句中使用XML节点的多个值

时间:2016-05-09 01:44:20

标签: sql sql-server xml tsql nodes

我有以下代码。我之前使用过与此类似的东西,允许在逗号分隔的字符串中输入多个值。

由于某些原因,查询仅采用第一个值而不继续读取值。 @Tables会像"Table1, table2, table3"有人看到我的错误吗?如果我在数据库上'1, 2, 3, 4'它可以工作但它不能用于字符串。

DECLARE @TableXML AS XML
SET @TableXML = cast(('<a>'+replace(@Tables,',' ,'</a><a>')
             +'</a>') AS XML);

SELECT
*   
FROM CABDetail 
WHERE CABDetail.BudgetName in (SELECT
    a.value('.', 'varchar(max)')
    FROM @TableXML.nodes('a') AS FN(a)
)

ORDER BY CABDetail.account

2 个答案:

答案 0 :(得分:2)

你可以TRIM结果:Table1, table2, table3

SELECT *   
FROM CABDetail 
WHERE CABDetail.BudgetName in (SELECT LTRIM(RTRIM(a.value('.', 'varchar(max)')))
                               FROM @TableXML.nodes('a') AS FN(a)
)
ORDER BY CABDetail.account;

LiveDemo

原因很简单,当你解析时,你会得到:

'Table1'
' table2'
' table3'

并且比较'table2'' table2'不同。

它适用于数字,因为您可以隐式CAST ' 2'为整数。

SELECT CAST(' 2' AS INT);
-- 2

替换', '代替','的另一种可能性:

DECLARE @TableXML AS XML
SET @TableXML = cast(('<a>'+replace(@Tables,', ' ,'</a><a>')
      +'</a>') AS XML);

SQL Server 2016+开始,您可以使用内置的STRING_SPLIT功能:

SELECT *
FROM #CABDetail
WHERE BudgetName in (SELECT RTRIM(LTRIM([value]))
                     FROM STRING_SPLIT(@Tables, ','));

LiveDemo2

答案 1 :(得分:0)

您的SQL脚本似乎在我的SQL2014 db上成功运行

declare @Tables as nvarchar(max) = 'Table1, table2, table3'

DECLARE @TableXML AS XML
SET @TableXML = cast(('<a>'+replace(@Tables,',' ,'</a><a>')+'</a>') AS XML);

SELECT
a.value('.', 'varchar(max)')
FROM @TableXML.nodes('a') AS FN(a)

似乎没什么问题 但您可以考虑使用SQL split string function并在Select语句中使用它,如下所示,如果您无法确定案例中的问题

declare @Tables as nvarchar(max) = 'Table1, table2, table3'
SELECT val FROM dbo.Split(@Tables, ',') a