可能重复:
参数化SQL IN子句?
在SQL Server中,我想为此做些什么......
DECLARE @Values varchar(1000)
SET @Values = 'A, B, C'
SELECT
blah
FROM
foo
WHERE
myField IN (@Values)
Run Code Online (Sandbox Code Playgroud)
这有可能或如何实现这一目标?
Chr*_*cht 39
你需要一个表变量:
declare @values table
(
Value varchar(1000)
)
insert into @values values ('A')
insert into @values values ('B')
insert into @values values ('C')
select blah
from foo
where myField in (select value from @values)
Run Code Online (Sandbox Code Playgroud)
理想情况下,您根本不应该在 T-SQL 中拆分字符串。
除非进行该更改,否则在 SQL Server 2016 之前的旧版本上创建拆分函数:
CREATE FUNCTION dbo.SplitStrings
(
@List nvarchar(max),
@Delimiter nvarchar(2)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN ( WITH x(x) AS
(
SELECT CONVERT(xml, N'<root><i>'
+ REPLACE(@List, @Delimiter, N'</i><i>')
+ N'</i></root>')
)
SELECT Item = LTRIM(RTRIM(i.i.value(N'.',N'nvarchar(max)')))
FROM x CROSS APPLY x.nodes(N'//root/i') AS i(i)
);
GO
Run Code Online (Sandbox Code Playgroud)
现在你可以说:
DECLARE @Values varchar(1000);
SET @Values = 'A, B, C';
SELECT blah
FROM dbo.foo
INNER JOIN dbo.SplitStrings(@Values, ',') AS s
ON s.Item = foo.myField;
Run Code Online (Sandbox Code Playgroud)
在 SQL Server 2016 或更高版本(或 Azure SQL 数据库)上,它更简单、更高效,但是您必须手动申请LTRIM()以消除任何前导空格:
DECLARE @Values varchar(1000) = 'A, B, C';
SELECT blah
FROM dbo.foo
INNER JOIN STRING_SPLIT(@Values, ',') AS s
ON LTRIM(s.value) = foo.myField;
Run Code Online (Sandbox Code Playgroud)