лучший подход для выполнения динамического запроса внутри SP - PullRequest
1 голос
/ 24 декабря 2011

У меня возникли проблемы с выполнением динамического запроса внутри моего SP, и я подумал о том, чтобы попросить о помощи, поскольку я не могу выполнить его правильно, независимо от того, что я пытаюсь:

Я пытался:

SET @subWorksQuery = 
'UPDATE JK_SubscriberWorks SET ' +
'update_date = convert(datetime, ''' + @dateNow + ''', 103), ' +
'challenge_' + convert(nvarchar(2), @challengeDay) + '_q = ''' + @challengeQuestion + ''', ' +
'challenge_' + convert(nvarchar(2), @challengeDay) + '_a = ''' + @challengeAnswer + ''' ' +
'WHERE subscriberwork_id = '' + convert(nvarchar(10), @subscriberWorksId) + '';';

execute @execReturn = @subWorksQuery

но я всегда получаю:

Сообщение 203, Уровень 16, Состояние 2, Процедура sp_InsertChallengeResponse_test, Строка 112
Имя 'UPDATE JK_SubscriberWorks SET update_date = convert (datetime,'23 -12-2011 23:35:17 ', 103), challenge_23_q =' Hvilket år blev Klasselotteriet omdannet til et aktieselskab? Få hjælp til svaret. ', challenge_23_a =' 1992 'WHERE subscriberwork_id =' + convert (nvarchar (10), @subscriberWorksId) + ';'не является допустимым идентификатором.

Удаление оператора UPDATE из этой ошибки и запускает его независимо , он запускает и выполняет обновление


Если яиспользуйте sp_executesql как

SET @subWorksQuery = 
N'UPDATE JK_SubscriberWorks SET ' +
'update_date = @a, ' +
'challenge_' + convert(nvarchar(2), @challengeDay) + '_q = @b, ' +
'challenge_' + convert(nvarchar(2), @challengeDay) + '_a = @c ' +
'WHERE subscriberwork_id = @d;';

SET @parmDefinition = N'@a datetime, @b nvarchar(250), @c nvarchar(500), @d decimal';

execute sp_executesql 
             @subWorksQuery,
             @parmDefinition,
             @a = @CreateDate, @b = @challengeQuestion, @c = @challengeAnswer, @d = @subscriberWorksId;

Он никогда не выполняет ОБНОВЛЕНИЕ, но не выдает никакой ошибки.

Что мне здесь не хватает?

Ответы [ 3 ]

1 голос
/ 24 декабря 2011

Запустите его так:

execute (@subWorksQuery)

[вы не получите ничего от оператора update в переменной, и вы не сможете запустить так execute (@execReturn = @subWorksQuery)]

Без скобок кажется, что он начинает синтаксический анализ, предполагая, что это имя хранимой процедуры, но терпит неудачу, когда он достигает максимальной длины для одной.

Сказав это, лучше использовать sp_executesql с параметрами.

0 голосов
/ 27 декабря 2011

просто мысль ... ваш параметр @d является десятичным значением. Ваш идентификатор int? возможен конфликт типов данных?

как определяются ваши входные параметры sp? Не могли бы вы опубликовать полный sp?

Дейв

0 голосов
/ 24 декабря 2011

Я не уверен, что вы ищете в возвращаемом значении, но если вам просто нужно количество затронутых строк, его легко получить.1005 * до:

execute (@subWorksQuery)
select @execReturn = @@ROWCOUNT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...