У меня есть запрос типа:
SELECT col1,col2 from table1 where col1 in (:var);
И этот :var имеет значение вроде "'1234', '5678'", которое представляет собой строку, состоящую из одинарных кавычек и запятых. Я хочу преобразовать эту строку в тип, который можно указать в качестве входных данных для оператора SQL "in", например:
SELECT col1, col2 from table1 where col1 in (STRING_SPLIT(:var));
DECLARE @var AS NVARCHAR(100) = '''1234'', ''5678'''; SELECT col1, col2 FROM table1 WHERE col1 IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@var, ','))
Как эта ссылка помогает stackoverflow.com/questions/10914576/t-sql-split-string
@NIKUNJPATEL Огромное спасибо, ты спас меня !!!!. Пожалуйста, добавьте свое решение в качестве ответа.
@Sufi Ответ добавлен.
Вы не можете использовать STRING_SPLIT для расширения литеральной строки с разделителями в несколько строк литералов с разделителями. STRING_SPLIT('abc,def',',') не приводит к 'abc','def', он приводит к набору данных из 2 строк, содержащих значения 'abc' и 'def'.
Если вы хотите передать строку с разделителями, вам нужно либо JOIN/CROSS APPLY на STRING_SPLIT, либо использовать подзапрос:
SELECT T1.Col1,
T1.Col2
FROM dbo.table1 T1
JOIN STRING_SPLIT(@YourVariable,',') SS ON T1.Col1 = SS.Value;
SELECT T1.Col1,
T1.Col2
FROM dbo.table1 T1
WHERE T1.Col1 IN (SELECT SS.Value
FROM STRING_SPLIT(@YourVariable,',') SS);
Однако вы можете добиться еще большей производительности с индексированной временной таблицей, если имеете дело с большими наборами данных:
CREATE TABLE #temp (Value varchar(30) PRIMARY KEY); --Use an appropriate data type. I assume unique values in the delimited string
INSERT INTO #temp (Value)
SELECT SS.Value
FROM STRING_SPLIT(@YourVariable,',') SS;
SELECT T1.Col1,
T1.Col2
FROM dbo.table1 T1
JOIN #Temp T ON T1.Col1 = T.Value;
Наконец, что может быть лучше, вы можете использовать параметр типа таблицы. Тогда вы, как и выше, просто JOIN к этому или используете EXISTS.
Это код как решение для достижения желаемого результата в запросе SQL-сервера.
DECLARE @var AS NVARCHAR(100) = '''1234'', ''5678''';
SELECT col1, col2 FROM table1 WHERE col1 IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@var, ','))
Вы не; STRING_SPLIT работает не так. Вам нужно JOIN разделить значение или использовать IN против подзапроса (который использует STRING_SPLIT). В качестве альтернативы переключитесь на параметр типа таблицы, и тогда вам вообще не нужно использовать STRING_SPLIT.