I’m having some trouble executing a dynamic query inside my SP, and I thought asking for some help as I can’t execute it correctly no matter what I try:
I have tried:
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
but I always get:
Msg 203, Level 16, State 2, Procedure sp_InsertChallengeResponse_test,
Line 112
The name ‘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) + ‘;’ is not a valid
identifier.
Removing the UPDATE statement from that error and run it independently, it runs and performs the update
If I use sp_executesql like
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;
It never performs the UPDATE, but does not throw any error.
What am I missing here?
Run it like this:
[you won’t be getting anything back from the update statement in the variable, and you can’t run like this
execute (@execReturn = @subWorksQuery)]Without parentheses it seems to be starting parsing, assuming it is a stored procedure name, but failing when it hits the max length for one.
In saying that, it is better to use
sp_executesqlwith parameters.