Передача varchar, полного значений, разделенных запятыми, в функцию SQL Server IN - PullRequest
49 голосов
/ 18 мая 2009

Дубликат
Динамический SQL-запрос с разделителями-запятыми
Параметризованные Запросы с Like и In

У меня есть хранимая процедура SQL Server, где я хотел бы передать varchar, полный значений, разделенных запятыми, в функцию IN. Например:

DECLARE @Ids varchar(50);
SET @Ids = '1,2,3,5,4,6,7,98,234';

SELECT * 
FROM sometable 
WHERE tableid IN (@Ids);

Это не работает, конечно. Я получаю ошибку:

Преобразование не удалось при преобразовании значения varchar '1,2,3,5,4,6,7,98,234' в тип данных int.

Как я могу сделать это (или что-то относительно похожее), не прибегая к созданию динамического SQL?

Ответы [ 22 ]

0 голосов
/ 21 февраля 2018
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 

рабочая скрипка найти здесь скрипка

0 голосов
/ 06 ноября 2014

Лучший и простой подход.

DECLARE @AccumulateKeywordCopy NVARCHAR(2000),@IDDupCopy NVARCHAR(50);
SET @AccumulateKeywordCopy ='';
SET @IDDupCopy ='';
SET @IDDup = (SELECT CONVERT(VARCHAR(MAX), <columnName>) FROM <tableName> WHERE <clause>)

SET @AccumulateKeywordCopy = ','+@AccumulateKeyword+',';
SET @IDDupCopy = ','+@IDDup +',';
SET @IDDupCheck = CHARINDEX(@IDDupCopy,@AccumulateKeywordCopy)
...