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))