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

Mik*_*lov 4 sql t-sql parameters stored-procedures reporting-services

我已经'param1, param2, parma3'从SSRS到存储过程作为varchar参数:我需要在查询的IN子句中使用它,但随后需要像这样首先更改其格式:

select *
from table1
where col1 in('param1', 'param2', 'param3')
Run Code Online (Sandbox Code Playgroud)

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

Hav*_*ame 7

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

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

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

SQL字段


小智 5

您可以使用 split 函数并按照以下方式使用它我的 split fnSplitString return 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
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您使用的是 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,',')
Run Code Online (Sandbox Code Playgroud)

有关 string_split 检查官方文档的更多信息

此外,TRIM()用于从空白处修剪值。


Adr*_*rma 5

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

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

SELECT *
FROM table1
WHERE col1 IN (SELECT value FROM STRING_SPLIT( @params , ','))
Run Code Online (Sandbox Code Playgroud)