При выполнении запроса sp_executesql ожидается параметр @statement - PullRequest
2 голосов
/ 16 апреля 2009

Я не уверен, как решить эту ошибку:

Процедура или функция sp_executesql ожидает параметр '@statement', который не был предоставлен.

для этого запроса:

DECLARE @a INT 
DECLARE @b VARCHAR 
SET @a = 1

WHILE @a < 30
BEGIN
set @b = @a  
exec sp_executesql update source_temp set pmt_90_day = pmt_90_day + convert(money,'trans_total_'+@b)+N'
    N'where convert(datetime,'effective_date_'+@b)+N' <= dateadd(day,90,ORSA_CHARGE_OFF_DATE)
    and DRC_FLAG_'+@b = 'C'''

SET @a = @a + 1
END

Кроме того, вы можете помочь мне понять правильное использование N 'и правильно ли оно сделано в этом утверждении.

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 16 апреля 2009

SP ожидает переменную типа string, а не оператор SQL. Оберните SQL в одинарные кавычки:

 exec sp_executesql 'some SQL statement';

Когда вы делаете это, избегайте любых одинарных кавычек в выражении, заменяя каждую одинарную кавычку двумя одинарными кавычками:

exec sp_executesql 'select 'AB' from dual';  -- wrong

exec sp_executesql 'select ''AB'' from dual';  -- right

Понятия не имею, что такое N. Как ты думаешь, что это? Это какое-то приведение к набору символов? Почему вы считаете это необходимым?

1 голос
/ 16 апреля 2009

Хранимая процедура sp_executesql ожидает выполнения однострочного параметра @statement.

Ваша строка здесь совершенно не в порядке ..... вам нужно ставить префикс любых «фиксированных» частей строки с помощью N '......', чтобы сделать их строками Unicode, но это определенно неправильно дело здесь.

Я думаю, вы можете попробовать это:

DECLARE @a INT 
DECLARE @b VARCHAR(2)

SET @a = 1

DECLARE @statement NVARCHAR(500)

WHILE @a < 30
BEGIN
    SET @b = CAST(@a AS VARCHAR(2))

    SET @statement = 
        N'update source_temp set pmt_90_day = pmt_90_day + ' + 
             'convert(money, ''trans_total_' + @b + ''') ' + 
             'where convert(datetime, ''effective_date_' + @b + ''')' +
             ' <= DATEADD(DAY, 90, ORSA_CHARGE_OFF_DATE) ' +
             'and DRC_FLAG_' + @b + ' = ''C'''

    exec sp_executesql @statement

    SET @a = @a + 1
END

Это работает и делает то, что вы ожидаете?

Объяснение: N '.........' разграничивает всю строку, содержащую инструкцию SQL. Любой апостроф внутри, который должен быть продублирован («экранирован»). Надеюсь, я правильно понял вашу логику.

Марк

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