在IN子句中使用逗号分隔的参数

时间:2014-12-22 15:59:04

标签: sql tsql stored-procedures reporting-services parameters

我有'param1, param2, parma3'来自SSRS作为varchar参数的存储过程:我需要在查询的IN子句中使用它,但是需要先更改它的格式:

select *
from table1
where col1 in('param1', 'param2', 'param3')

在不创建函数和参数表的情况下重新格式化参数的最佳方法是什么?

6 个答案:

答案 0 :(得分:5)

试试这个,只需要在@params字符串的开头和结尾添加逗号。

Declare @params varchar(100) Set @params = ',param1,param2,param3,'

Select * from t
where CHARINDEX(','+cast(col1 as varchar(8000))+',', @params) > 0

SQL FIDDLE

答案 1 :(得分:2)

您可以使用拆分功能并按以下方式使用它 这里我的split fnSplitString返回splitdata

select * from tb1 where id in(select splitdata from dbo.fnSplitString((select col1 from tb12 where id=3),','))


create FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output(splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

答案 2 :(得分:2)

如果您使用的是SQL 2016及更高版本string_split,则可以使用。

-- @param is where you keep your comma separated values example: 
declare @param = 'param1,param2,param3'
select * from table1 where col1 in (select TRIM(value) from string_split(@param,',')

有关string_split检查offical documemt

的更多信息

此外,TRIM()用于修剪空白中的值。

答案 3 :(得分:1)

&#34;最佳方式&#34;是有争议的,但一种经典的方法仍然没有&#34;创建函数和表格参数&#34;就是在存储过程中简单地使用动态SQL:

-- FORNOW: local to act as the SP param and arg
declare @values varchar(100) = 'param1, param2, param3'

-- Add opening and closing single quotes, then quotes around each
-- comma-separated list item.
select @values = '''' + REPLACE(@values, ', ', ''', ''') + ''''

-- FORNOW: for clarity/debugging
print @values
--'param1', 'param2', 'param3'

-- Run the desired query as dynamic SQL.
DECLARE @sql as nvarchar(250);
SET @sql = 'select * from table1 where col1 in (' + @values + ')';

EXEC sp_executesql @sql;

这假设了几件事:

  1. 值列表中的逗号后跟一个空格。当然,这个解决方案的变化可以解决这方面的偏差,但重要的是要注意这个假设。
  2. 逗号分隔的值本身并没有逗号 - 不太可能,但值得一提,因为值是否满足此约束有时会被忽视。

答案 4 :(得分:1)

将Params加载到字符串中并以sql:

的形式执行
declare @param varchar(1000) = 'param1, param2, parma3'
declare @sql varchar(4000)
select @sql = 
'select *
from table1
where col1 in(''' + replace(@param,',',''',''') + ''')'

-- print @sql -- to see what you're going to execute
exec sp_executesql @sql

答案 5 :(得分:0)

我们可以在 SQL SERVER 中使用 STRING_SPLIT()

DECLARE @params varchar(max)= 'param1,param2,param3'

SELECT *
FROM table1
WHERE col1 IN (SELECT value FROM STRING_SPLIT( @params , ','))