设置具有多个值的变量并使用IN关键字。

34 浏览
0 Comments

设置具有多个值的变量并使用IN关键字。

这个问题已经在此处有了答案

可能是重复的:

如何将 SQL IN 子句参数化?

在 SQL Server 中我想做类似这样的事情...

DECLARE @Values varchar(1000)
SET @Values = 'A, B, C'
SELECT
  blah
FROM 
  foo
WHERE
  myField IN (@Values)

这是可能的吗?如何实现?

admin 更改状态以发布 2023年5月21日
0
0 Comments

理想情况下,您根本不应该在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'' 
        + REPLACE(@List, @Delimiter, N'') 
        + N'')
    )
    SELECT Item = LTRIM(RTRIM(i.i.value(N'.',N'nvarchar(max)')))
      FROM x CROSS APPLY x.nodes(N'//root/i') AS i(i)
  );
GO

现在您可以这样说:

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;

在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;

0
0 Comments

您需要一个表变量:

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)

0