2016-05-09 40 views
0

我有下面的代码。我之前使用过与此类似的东西,允许在逗号分隔的字符串中输入多个值。使用XML节点的where子句中的TSQL多个值

由于某些原因,尽管查询只接受第一个值,并且不会继续读取值。 @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 
+1

应该已经工作假设'CABDetail.BudgetName'包含值表1,表2,表3中的一个识别问题。你可以用可以用来重现问题的数据创建示例表吗? – har07

回答

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

0

你的SQL脚本似乎对我的SQL2014数据库成功合作

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