Передача параметра в оператор IN SQL - PullRequest
1 голос
/ 29 февраля 2012

Я собрал некоторые значения для поиска в столбце БД внутри строковой переменной и пытался передать это как параметр в SQL StoredProcedure.

ALTER PROCEDURE [dbo].[InkDB]
(
@ser nvarchar(255),
@svt nvarchar(255)
)
AS
SELECT DISTINCT Details from tbData WHERE (Name IN @svt AND Address=@ser)

Это дает мне сообщение syntax error near @svtпри попытке запустить запрос.

На моей веб-странице этот параметр имеет значение, аналогичное ('PersonA', 'Person B', 'Person C'), которое передается.Как использовать оператор IN в этом случае?

Ответы [ 4 ]

2 голосов
/ 29 февраля 2012

Я бы сделал это с XML. Не удалось найти это решение в повторяющемся вопросе, поэтому я добавляю его сюда.

Ваш ИП может выглядеть так:

alter procedure InkDB
  @ser nvarchar(255),
  @svt xml
as

declare @T table
(
  Name nvarchar(50)
)

insert into @T
select T.N.value('.', 'nvarchar(50)')
from @svt.nodes('/N') as T(N)

select distinct Details
from tbData 
where Name in (select Name from @T) and
      Address=@ser

И вы бы назвали это так.

exec InkDB '', '<N>PersonA</N><N>PersonB</N>'
1 голос
/ 29 февраля 2012

Динамический запрос

Alter procedure test
(
    @ser nvarchar(255),
    @svt nvarchar(255)
)
AS
BEGIN
   declare @sql nvarchar(Max)

   Set @sql='SELECT DISTINCT semester_code from mst_paper WHERE course_code IN ('+@svt+') AND branch_code='+@ser+''

   exec sp_executesql @sql
END
0 голосов
/ 29 февраля 2012

Это распространенная ошибка - вы передаете одно значение (выражение) типа string оператору IN, но IN ожидает список значений (выражений) через запятую, а не одну строковую переменную.

Здесь вам нужно иметь функцию, которая будет разбивать данный параметр на несколько значений на основе заданного разделителя, а затем использовать этот список с ключевым словом IN. Например,

SELECT DISTINCT Details from tbData WHERE Name IN (SELECT Val FROM dbo.efn_Split(@svt, ',')) AND Address=@ser

где efn_Split - это функция табличных значений, которая разбивает значения через запятую в таблицу. Посмотрите эти различные вопросы SO для реализации такой функции:
Эквивалент сплит-функции в T-SQL?
Как разбить строку, используя символ-разделитель, используя T-SQL?

Еще одна альтернатива - создать оператор SQL и выполнить его с помощью sp_executesql.

0 голосов
/ 29 февраля 2012

IN должно быть следующим:

... IN (@ param1, @ param2, ...)

Итак, вы должны сделать:

SELECT DISTINCT Details from tbData WHERE Name IN (@svt) AND Address=@ser

Обновление:

Синтаксически неправильное утверждение процедуры alter, указанное вами в вашем вопросе.В моем ответе указан правильный синтаксис для написания заявления, и он компилируется.

Повторно читая ваш вопрос, я вижу, что на самом деле у вас есть две проблемы.Первой была синтаксическая ошибка, а вторая передача списка с разделителями-запятыми в одном параметре.

Ответ: вы просто не можете предоставить список значений с разделителями-запятыми во время выполнения в один параметр строкового типа, который используетсяв предложении IN (...).Теперь, что касается второго пункта, я бы сказал, что это не очень хороший подход к проектированию / программированию, но это можно сделать с помощью динамического SQL или анализа каждого значения из строкового параметра, сохранить их во временной таблице и затем пересмотреть.Ваш запрос присоединиться к этому, или использовать (или использовать табличную функцию и сохранить проанализированные элементы там, откуда ее можно запросить.

Ниже приведен исправленный синтаксис для вашего кода, но он не будетРешите второй аспект передачи строки, содержащей список значений, разделенных запятыми. Это можно решить, как я описал выше.

Для синтаксической ошибки сначала вы можете создать фиктивную таблицу для проверки вашего кода.Обратите внимание, что типичная таблица базы данных должна иметь первичный ключ. Это строго фиктивная таблица для проверки оператора:

CREATE TABLE TbData (Имя nvarchar (255), Подробности nvarchar (255), Адрес nvarchar (255));

Затем вы можете создать начальную хранимую процедуру:

CREATE PROCEDURE Test (@ser nvarchar (255)), @svt nvarchar (255)) КАК НАЧАТЬ ВЫБРАТЬ РАЗЛИЧНЫЕ ДЕТАЛИ ОТ tbData WHERE Имя IN (@ser) И Адрес = @svt END

И, наконец, выполните оператор alter хранимой процедуры, о котором вы спрашивали:

Тест ALTER PROCEDURE (@ser nvarchar (255), @svt nvarchar (255)) КАК НАЧИНАЕТСЯ ВЫБРАТЬ ОТЛИЧИЯ Подробности ОТ tbData ГДЕ IN IN (@ser) И Address = @svt END

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...