使用逗号分隔值从VARCHAR参数创建IN子查询

时间:2013-11-26 18:33:43

标签: sql-server tsql stored-procedures

我有一个存储过程,我需要将逗号分隔的变量传递给。

例如,如果存在某种情况,我会传递一个国家代码列表,如下所示:

AU,RA,PK

项目数量可能会有所不同。

在存储过程中,我需要在IN子句中使用这些项,如下所示:

WHERE CountryCode IN (@ExcludeCountries)

有没有办法做到这一点?如果需要,我可以按下N'AU', N'RA', N'PK'之类的国家代码。

感谢。

3 个答案:

答案 0 :(得分:0)

WHERE CountryCode IN (SELECT *
                      FROM [dbo].[ufn_CSVToTable](@ExcludeCountries,',')

这是您创建[dbo].[ufn_CSVToTable]的方法:
How to convert comma separated NVARCHAR to table records in SQL Server 2005?

答案 1 :(得分:0)

在实践中,我已经看到使用下面的功能解决了这个问题。此函数拆分字符串并返回包含指定值的表。然后像这样使用它......

  

... CountryCode IN(SELECT * FROM dbo.SplitString(@ExcludeCountries,','))

请注意,在此示例中,逗号(',')是分隔符。我已经使用这种方法多年了,我没有遇到任何性能问题。

CREATE FUNCTION [dbo].[SplitString]
(
@SplitStr nvarchar(MAX),
@SplitChar nvarchar(5)
) 
RETURNS @RtnValue table 
(
Data nvarchar(MAX)
) 
AS 
BEGIN 
Declare @Count int
Set @Count = 1

While (Charindex(@SplitChar,@SplitStr)>0)
Begin
Insert Into @RtnValue (Data)

Select 
Data = ltrim(rtrim(Substring(@SplitStr,1,Charindex(@SplitChar,@SplitStr)-1)))

Set @SplitStr = Substring(@SplitStr,Charindex(@SplitChar,@SplitStr)+1,len(@SplitStr))
Set @Count = @Count + 1
End

Insert Into @RtnValue (Data)
Select Data = ltrim(rtrim(@SplitStr))

Return
END

答案 2 :(得分:-1)

有两种方法可以做到:

  1. 使用后者加入查询的@ExcludeCountries参数构建表变量表
  2. 像这样构建一个动态SQL语句

    ... + 'WHERE CountryCode IN' (' + @ExcludeCountries + ')' ...
    

    然后使用sp_executesql执行语句