我的代码:
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中的参数。
答案 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