Как поместить параметризованную транзакцию sql в курсор? - PullRequest
0 голосов
/ 11 июля 2019

Для более подробного объяснения у меня есть такой сценарий.

Я знаю, что это правильный способ инициировать курсор:

DECLARE cur CURSOR LOCAL FOR 
    SELECT NAME FROM namelist;
OPEN cur;

Но мне нужно, чтобы он был таким

DECLARE cur CURSOR LOCAL FOR 
    SELECT NAME FROM namelist where nameID in ('1,2,3,4');
OPEN cur;

Причина в том, что я передаю числа (1,2,3,4) для параметра моей хранимой процедуры

, поэтому допустим, что у меня есть этот параметр, который был взятиз системы

declare @namelist as varchar(20) 
set @namelist = '1,2,3,4'

Я хочу, чтобы значение параметра использовалось в моем IN выражении

DECLARE cur CURSOR LOCAL FOR 
    SELECT NAME FROM namelist where nameID in (@namelist)
OPEN cur;

, но я знаю, как это сделать, используяэтот метод:

    exec (SELECT NAME FROM namelist where nameID in ('+@namelist+'))

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

DECLARE cur CURSOR LOCAL FOR 
     exec (SELECT NAME FROM namelist where nameID in ('+@namelist+')
OPEN cur;

ошибка, которая заявляет

Incorrect syntax  near exec, expecting'(', SELECT, or WITH

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

1 Ответ

2 голосов
/ 11 июля 2019

Я сомневаюсь, что вам действительно нужен CURSOR здесь, почти каждый раз (я бы дошел до 99% времени), CURSOR используется неправильно, и метод, основанный на множествах, будет намного лучше.

В любом случае, для того, что вы хотите здесь, вам лучше использовать параметр табличного значения.Я предполагаю, что это внутри SP, поэтому вам придется сделать что-то вроде этого:

CREATE TYPE dbo.IntList AS TABLE (I int);
GO

ALTER YourSP @FirstParam varchar, @NameID dbo.IntList READONLY AS
BEGIN ...

    DECLARE cur CURSOR LOCAL FOR 
         SELECT NAME FROM namelist NL JOIN @NameID N ON NL.NameID = N.I;
    ...

END;

GO

DECLARE @NameID dbo.IntList;
INSERT INTO @NameID
VALUES(1),(2),(3),(4);

EXEC YourSP @FirstParam = 'SomeValue', @NameID = @NameID READONLY;

Если вы все же хотите перейти к подходу на основе множеств, вылучше было бы задать другой вопрос.Как передать список элементов (CURSOR) и как изменить итерационный метод на метод, основанный на множестве, - это очень разные и не связанные вопросы.

...