Sql server 在逗号分隔的字符串中
我想从临时表的完整列表中检索某些用户。 查询如下所示:Sql server 在逗号分隔的字符串中,sql-server,delimiter,where-in,Sql Server,Delimiter,Where In,我想从临时表的完整列表中检索某些用户。 查询如下所示: DECLARE @List varchar(max) SELECT @List = coalesce(@List + ',','') + '''' + StaffCode + '''' FROM tblStaffs SELECT UserName FROM #temptable WHERE #temptable.StaffCode IN (@List) 我可以看出@List的格式是正确的: 'AAA','ABB','BBB','CCC'
DECLARE @List varchar(max)
SELECT @List = coalesce(@List + ',','') + '''' + StaffCode + ''''
FROM tblStaffs
SELECT UserName
FROM #temptable
WHERE #temptable.StaffCode IN (@List)
我可以看出@List的格式是正确的:
'AAA','ABB','BBB','CCC','DDD','MMM'
如果我把它改成
WHERE #temptable.StaffCode IN ('AAA','ABB','BBB','CCC','DDD','MMM')
它当然可以工作,那么为什么不在@List中呢?创建一些拆分字符串函数,并将逗号分隔的值转换为行,然后您可以在子句中使用转换后的行 检查各种分割字符串函数 如果你不想创建函数,那么你也可以直接使用代码,而不是创建一个新函数 另一种方法是使用动态查询
要调试动态查询,请在执行之前始终打印动态sql。我建议您根本不要使用逗号分隔的字符串。换个角度:
因为变量有一个字符串,在运算符中读作'AAA,ABB,BBB',并将其视为单个值 在您的查询中,您应该在In运算符中使用查询本身,例如
Select UserName
From #temptable
Where #temptable.StaffCode IN (SELECT StaffCode From tblStaffs)
无论如何,如果需要使用变量,然后从该变量读取IN运算符中的值,您可以执行以下操作
DECLARE @List VARCHAR(1000);
Select @List = coalesce(@List + ',','') + StaffCode
From tblStaffs
SELECT *
From #temptable
Where #temptable.StaffCode IN (
SELECT t.c.value('.', 'VARCHAR(1000)')
FROM (
SELECT x = CAST('<t>' +
REPLACE(@List , ',', '</t><t>') + '</t>' AS XML)
) a
CROSS APPLY x.nodes('/t') t(c))
它不会在“AAA,BBB”中起作用,这才是真正正在发生的事情;我相信您需要将@List解析成一个小临时表并加入它。感谢您指出这一点。这真的是我想知道的。解决这个问题的一种方法是使用动态sql,正如Eric在前面的问题中所回答的:@zerubabel-这只是一个创建拆分字符串函数的示例。我给了你一个链接,你也可以从那里创建一个拆分字符串函数。@Zerubabel-用另一个答案更新了。检查一下。如果@List是存储过程或函数参数会怎么样?@GlassCannon我之所以提出这个建议,是因为OP中的示例没有@List作为存储过程参数,但是在它被使用之前,它被声明并填充。如果它是一个存储过程参数,并且允许更改存储过程的签名,那么我建议使用表值参数而不是逗号分隔的字符串。如果由于任何原因,不能修改SPCROC的参数,那么只有在考虑到所接受的答案时,才会考虑字符串分割函数。
select [Temp].[UserName]
from
#temptable [Temp]
where
exists (select 1 from [tblStaffs] where [tblStaffs].[StaffCode] = [Temp].[StaffCode]);
Select UserName
From #temptable
Where #temptable.StaffCode IN (SELECT StaffCode From tblStaffs)
DECLARE @List VARCHAR(1000);
Select @List = coalesce(@List + ',','') + StaffCode
From tblStaffs
SELECT *
From #temptable
Where #temptable.StaffCode IN (
SELECT t.c.value('.', 'VARCHAR(1000)')
FROM (
SELECT x = CAST('<t>' +
REPLACE(@List , ',', '</t><t>') + '</t>' AS XML)
) a
CROSS APPLY x.nodes('/t') t(c))