Передача значения через запятую из .NET в хранимую процедуру с использованием значения в функции SQL «IN» - PullRequest
4 голосов
/ 18 ноября 2010

У меня есть запрос SQL, подобный следующему:

create procedure test
(
   @param1 nvarchar(max)
)
as
begin
    select * from table where column1 in (@param1)
end

Теперь мне нужно передать значение @param1 из моего приложения .net таким образом, чтобы сработал вышеуказанный запрос.

Может, кто-нибудь посоветует мне, как передать из моего кода VB.NET значение, подобное приведенному ниже:

'1','2','3'

Мой главный вопрос: как мне структурировать значение параметра, как в примере выше, из моего приложения .NET?

Ответы [ 3 ]

4 голосов
/ 18 ноября 2010

так быстро, я бы создал табличную функцию , которая бы анализировала ее, чтобы вы могли сделать

   select * 
   from table 
   where field in (select field from dbo.myfunction(@param1))
3 голосов
/ 18 ноября 2010

Для этого типа вещей я использую эту функцию и использую ее следующим образом:

выберите Столбец1, столбец2 из моей таблицы, где ID в (выберите элемент из fnSplit ('1,2,3,4,5,6', ','))

create FUNCTION [dbo].[fnSplit](
        @sInputList VARCHAR(8000) -- List of delimited items
      , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
    ) 

RETURNS @List TABLE (item VARCHAR(8000))

BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
 BEGIN
 SELECT
  @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
  @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

 IF LEN(@sItem) > 0
  INSERT INTO @List SELECT @sItem
 END

IF LEN(@sInputList) > 0
 INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
1 голос
/ 18 ноября 2010

Не думаю, что проблема в передаваемых вами значениях. @ param1 это просто строка.

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

Если вашей табличной переменной является таблица @param_list, процедура проверки выглядит следующим образом:

create procedure test ( @param1 nvarchar(max) ) 
as begin 
select * from table where column1 in (Select thefield from @param_list); 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...