我有以下代码。我之前使用过与此类似的东西,允许在逗号分隔的字符串中输入多个值。
由于某些原因,查询仅采用第一个值而不继续读取值。 @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
答案 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