我想要与此等效的整数。
--Valid SQL
DECLARE @users AS nvarchar(50)
SET @users = 'Joe ,Bob,Fred,Tim' --1,2,8,23
select * FROM Person AS p
WHERE CHARINDEX(p.sFullName,@users) > 0
所以像这样。
--Invalid SQL
DECLARE @users AS nvarchar(50)
SET @users = '1,2,8,23'
select * FROM Person AS p
WHERE p.ixPerson IN(@users
您还没有真正指出如何调用它。您是否真的有一个充满逗号分隔的整数的字符串,或者这只是系统其他方面的产物?
如果围绕此要求的外部环境是可变的,那么通常在 SQL Server 2008 及更高版本中,我传递一个包含 ID 列表(可能来自 ADO.NET 或其他)的表值参数,然后将其用作过程中的表 - 即
WHERE value IN (SELECT id FROM @table)
或INNER JOIN @table AS t ON t.id = users.t
选项 1(第一部分直接来自Adam Machanic 的博客)
当然,这只是创建数字表的一种方法。如果您正在寻找随机分类的 id,您可以使用表格变量或其他东西快速填充数字表格。但是,您必须将代码中的列表或使用 billinkc 建议的 UDF 分开,此时构建该
IN
子句可能会更好。选项 2(在此处使用@CadeRoux 的答案):
我会看一个数字表类型的解决方案,将分隔的数据拆分成可以使用的东西https://stackoverflow.com/questions/8956671/how-to-convert-varchar-to-integer-in-sql-server -stored-procedure/8958460#8958460然后你可以使用IN子句就好了
我希望这个简单的解决方案在许多情况下都可以正常工作,尽管它并不能特别扩展(但您的问题中的示例也没有使用 CHARINDEX):
我不喜欢这个解决方案,但这就是我所做的。