Предложение IN имеет параметр, который не работает в хранимой процедуре

У меня есть "Name IN (@NameList))" внутри хранимой процедуры как одно из условий.

Параметр объявлен как @NameList varchar(100) = ''

Когда я выполняю процедуру со строкой типа EXEC myProc @NameList='''a''', процедура ничего не возвращает, но когда я заменил параметр жестко закодированным значением, например 'a', все получилось.

Я помещаю оператор PRINT в SP, и он печатает ровно 'a'

Что здесь не так?

Спасибо,


person Lys    schedule 27.07.2018    source источник
comment
Вопросы, требующие помощи в отладке (почему этот код не работает?), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для их воспроизведения, в самом вопросе. Вопросы без четкой формулировки проблемы бесполезны для других читателей. См.: Как создать минимальный, полный и проверяемый пример.   -  person TomTom    schedule 27.07.2018
comment
Что неправильно, так это то, что предложение IN предполагает проверку списка значений, но вы предоставляете только одну строку в качестве входных данных.   -  person marc_s    schedule 27.07.2018
comment
@marc_s оператор IN будет работать с одним значением. Где имя пользователя ('ralph'), например, работает нормально. Не то чтобы ты должен, но ты мог бы.   -  person GandRalph    schedule 27.07.2018
comment
@marc_s Хотя я согласен, если Lys будет использовать этот метод для списка, разделенного запятыми, он не будет работать, так как запятые будут частью строки, которая не удастся.   -  person GandRalph    schedule 27.07.2018
comment
Похоже, вы приближаетесь к этому моменту, поэтому сейчас я дам вам этот совет. Лучший способ решить проблему передачи нескольких значений в SQL Server — использовать тип, разработанный для хранения нескольких значений (в идеале — табличных параметров. В худшем — XML или JSON). Вы втягиваете себя в эту проблему, вместо этого пытаясь передать несколько значений в виде строки.   -  person Damien_The_Unbeliever    schedule 27.07.2018


Ответы (1)


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

   declare @list varchar(max) = '13,14,15,13,14,15,13'

   SELECT
      LTRIM(RTRIM(a.b.value('.[1]','VARCHAR(255)'))) Parish
   FROM
     (
      SELECT CAST('<XMLRoot><RowData>' +  REPLACE(@list,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) x)t 
      CROSS APPLY x.nodes('/XMLRoot/RowData')a(b)
person GandRalph    schedule 27.07.2018