我们可以将SQL中的逗号分隔列表作为参数传递

时间:2016-08-20 10:56:32

标签: sql sql-server database comma

我的代码:

declare @text as nvarchar(max)
set @text=N'''ABC'',''XYZ'',''MNO'',''PQR'''
print @text
select * from table where column in(@text)  --Line1
select * from table where column  in('ABC','XYZ','MNO','PQR') --Line2

执行Line1和Line2会得到不同的结果。 Line2工作正常,但无法执行Line1。 任何人都可以帮助我。 我想执行Line1,因为列表将是我在Stored Procdure中的参数。

4 个答案:

答案 0 :(得分:2)

你可以。但您不能将IN用于您想要的行为。所以,一种方法是:

select t.*
from table
where ',' + @text + ',' like '%,' + column + ',%' ;

另一种方法是使用动态SQL和exec

另一种方法是使用split()功能:

with vals(val) as (
      select *
      from dbo.split(@text, ',')
     )
select t.*
from table t
where t.column in (select v.val from vals v);

您可以通过Google“SQL Server拆分”来查找split()功能的代码。

还有其他方法可以将vals计算为一个表,包括递归CTE和XML处理。

答案 1 :(得分:1)

我在处理SSRS报告时使用它。传递分隔的字符串并拆分成临时表,然后可以在IN子句中加入或使用它。

CREATE FUNCTION dbo.GetTableFromDelimitedString
    (
     @str VARCHAR(8000),
     @delimiter CHAR(1)
    )
RETURNS @t TABLE (Col VARCHAR(50))
AS
    BEGIN
        DECLARE @s VARCHAR(100),
            @l INT,
            @cnt INT;
        SET @l = LEN(@str);
        SET @s = '';
        SET @cnt = 1;
        WHILE @cnt <= @l
            BEGIN
                IF SUBSTRING(@str, @cnt, 1) = @delimiter
                    BEGIN
                        INSERT  INTO @t
                                (Col)
                        VALUES  (@s);
                        SET @s = '';
                    END;
                ELSE
                     BEGIN
                        SET @s = @s + SUBSTRING(@str, @cnt, 1);
                    END;
                SET @cnt = @cnt + 1;
            END;

---insert last one
        INSERT  INTO @t
                (Col)
        VALUES  (@s);
        RETURN; 
    END;

此功能的代码:

select count(DEPTNAME)
from Department
where lower(DEPTNAME) LIKE '%comp%';

答案 2 :(得分:0)

不使用任何拆分功能和Sargable解决方案的另一种可能的解决方案就是......

Declare @text nvarchar(max), @xml xml;

SET @text= N'ABC,XYZ,MNO,PQR';

SET @xml = N'<root><r>' + replace(@text, ',','</r><r>') + '</r></root>';

select * 
from table 
where column in(
                select r.value('.','varchar(max)') 
                from @xml.nodes('//root/r') as records(r)
                );

答案 3 :(得分:0)

CREATE TABLE t 
  ( 
     id   INT, 
     col1 VARCHAR(50) 
  ) 

INSERT INTO t 
VALUES     (1, 
            'param1') 

INSERT INTO t 
VALUES     (2, 
            'param2') 

INSERT INTO t 
VALUES     (3, 
            'param3') 

INSERT INTO t 
VALUES     (4, 
            'param4') 

INSERT INTO t 
VALUES     (5, 
            'param5') 

DECLARE @params VARCHAR(100) 

SET @params = ',param1,param2,param3,' 

SELECT * 
FROM   t 
WHERE  Charindex(',' + Cast(col1 AS VARCHAR(8000)) + ',', @params) > 0 

找到工作小提琴http://sqlfiddle.com/#!3/71c5d/1