Подтвердить что ты не робот

Задайте переменную с несколькими значениями и используйте IN

Возможный дубликат:
Параметрирование предложения SQL IN?

В SQL Server я хотел бы сделать что-то с этим...

DECLARE @Values varchar(1000)

SET @Values = 'A, B, C'

SELECT
  blah
FROM 
  foo
WHERE
  myField IN (@Values)

Возможно ли это или как это сделать?

4b9b3361

Ответ 1

Вам нужна переменная таблицы:

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)

Ответ 2

В идеале вам вообще не следует разбивать строки в 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

Теперь вы можете сказать:

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 или более LTRIM() версии (или в базе данных SQL Azure) это намного проще и эффективнее, однако вам нужно вручную применять 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;

Ответ 3

Используйте таблицу Temp или переменную таблицы, например

select 'A' as [value]
into #tmp
union
select 'B'
union 
select 'C'

а затем

SELECT   
blah 
FROM    foo 
WHERE   myField IN (select [value] from #tmp) 

или

SELECT   
f.blah 
FROM foo f INNER JOIN #tmp t ON f.myField = t.[value]