它不起作用的原因是因为 @P1 被视为一个单一值。
例如当 @Code 为 X101,B202 时,查询将按以下方式运行:
SELECT * FROM 表 WHERE RegionCode IN ('X101,B202')
因此,它正在寻找具有 @P1 包含的值的 RegionCode。即使包含单引号,这也意味着它在 RegionCode 中搜索的值应该包含这些单引号。
您需要实际将 @Code 变量连接到 @Cmd sql 命令文本中,以便它按照您的想法工作:
SET @Code = '''X101'',''B202'''
SET @Cmd = 'SELECT * FROM Table WHERE RegionCode IN (' + @Code + ')'
EXECUTE (@Cmd)
但显然,这只会让您面临 SQL 注入,因此如果您采用这种方法,则需要非常小心,以确保防范这种情况。
如果您想要传递要搜索的动态值列表,则可以使用其他方法来处理这种情况。
查看示例my blog http://www.adathedev.co.uk/2010/02/sql-server-2008-table-valued-parameters.html有两种方法可以与 SQL Server 2005 一起使用。一种方法涉及以“Value1,Value2,Value3”的形式传入 CSV 列表,然后使用用户定义的函数将其拆分为 TABLE 变量(有很多提及此方法)如果您快速谷歌或搜索此网站,则可以使用这种方法)。拆分后,您可以将该 TABLE var 加入到您的主查询中。第二种方法是传入包含值的 XML blob 并使用 SQL Server 的内置 XML 功能。这两种方法都通过该链接中的性能指标进行了演示,并且它们不需要动态 SQL。
如果您使用的是 SQL Server 2008,则表值参数将是最佳选择 - 这是我在该链接中演示的第三种方法,效果最好。