Tsql 对IN子句使用逗号分隔的varchar

Tsql 对IN子句使用逗号分隔的varchar,tsql,sql-server-2012,Tsql,Sql Server 2012,我有一个userId列表DECLARE@userId as VARCHAR='1,4,65,12',我想在in子句中使用它。结果应该类似于,其中Id位于(1,4,65,12) 我尝试了以下代码: ALTER FUNCTION [dbo].[GetUser](@userId VARCHAR) RETURNS TABLE AS RETURN( SELECT * FROM UserTable WHERE Id IN (@userId)) 但它只适用于第一个int值。在本例中,

我有一个userId列表
DECLARE@userId as VARCHAR='1,4,65,12'
,我想在in子句中使用它。结果应该类似于
,其中Id位于(1,4,65,12)

我尝试了以下代码:

ALTER FUNCTION [dbo].[GetUser](@userId VARCHAR)
RETURNS TABLE AS RETURN(
    SELECT *
    FROM UserTable
    WHERE Id IN (@userId))
但它只适用于第一个int值。在本例中,它仅适用于1


有什么想法吗?

你不能在子句中使用这样的
。它编译为
in
子句中的单个字符串。但是
IN
子句需要单独的值

WHERE id in (@userId)
编译成

WHERE id in ('1,4,65,12')
但应该是这样

WHERE id in (1,4,65,12)
如果确实需要查询是动态的,那么可以使用

exec('SELECT * FROM UserTable WHERE Id IN (' + @userId + ')')
你需要给你的输入参数一个长度,比如

ALTER FUNCTION [dbo].[GetUser](@userId VARCHAR(1000))

我发现这个问题是一样的:


我将尝试此解决方案。

您的逗号分隔值正在转换为的单个整数。我已在另一个问题中回答了此问题,请查看您是否接受此解决方案。谢谢重播!我已经尝试过了,但是
exec('SELECT*FROM UserTable WHERE Id IN(+@userId+'))
返回与
WHERE Id IN(@userId))
相同的结果。我更新了答案。您需要为参数指定一个长度:
(@userId VARCHAR(1000))
,否则它只是一个字符