Нужна помощь в отладке хранимой процедуры T-SQL со сценариями sql, хранящимися в таблице.

В этой хранимой процедуре я читал из таблицы стороннего поставщика с именем M_SopInsert.

SQLScript — это имя столбца, и каждая запись в этой таблице содержит SQL-запрос, который выполняет UPDATE, INSERT или DELETE.

Я вижу реальный сценарий, когда отлаживаю его с помощью Select (комментарии ниже). Но сам скрипт не выполняется и ошибок я не вижу.

Я попытался жестко закодировать оператор UPDATE ниже, и он отлично работает.

В чем тут может быть дело?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
declare @sopScript nvarchar(1000)

select SQLScript into #ControlTbl from  M_SopInsert 
where soptype = @I_vSOPTYPE and sopnumbe = @I_vSOPNUMBE and lnitmseq = @I_vLNITMSEQ

while exists (select * from #ControlTbl)
begin

   select top 1 @sopScript = SQLScript
   from #ControlTbl

   --exec executesql @sopScript = SQLScript 
   --select @sopScript
   --EXEC sp_executesql @sopScript;
   --EXEC sp_executesql "update SOPQty set QTYORDER = '17.89' where LNIT = '16'"
exec sp_executesql @sopScript = SQLScript
   delete from #ControlTbl where SQLScript = @sopScript

end
drop table #ControlTbl
return (@O_iErrorState)

person Anirudh    schedule 26.08.2013    source источник
comment
Синтаксическая ошибка, которую, как вы сказали, вы исправили, чтобы заставить ее работать, должна была дать Msg 2812, Could not find stored procedure 'SQLScript'. - это весь код, или он заключен в TRY/CATCH или что-то еще?   -  person Aaron Bertrand    schedule 27.08.2013


Ответы (2)


Вы не видите никаких ошибок, потому что у вас есть пустой улов. Это как настроить будильник, а затем отключить его. Ошибка, которую вы, вероятно, получите, заключается в том, что вы не можете передать строку VARCHAR в sp_executesql — она должна быть NVARCHAR. Пытаться:

declare @sopScript Nvarchar(1000)
-------------------^
person Aaron Bertrand    schedule 26.08.2013
comment
На самом деле я удалил блок catch, но, размещая свой пост, я его не удалял. Так что на данный момент блока catch нет. Также переход на nvarchar не внес изменений. По какой-то причине, когда у меня был varchar, строка ниже не работала. exec executesql @sopScript = SQLScript - person Anirudh; 27.08.2013
comment
@Анируд, давай. Отладка 101. Пробовали ли вы просто выбирать из #ControlTbl вместо того, чтобы зацикливаться и выполнять содержимое? Также может быть, что в таблицу #temp не были вставлены строки. Также может быть, что вы выполняете одну базу данных и проверяете, были ли команды выполнены в другой. В вашей строке подключения есть AttachDbFileName? - person Aaron Bertrand; 27.08.2013
comment
Я заменил exec sp_executesql @sopScript = SQLScript на exec sp_executesql @sopScript, и это сработало. Я не знаю, в чем разница между ними. - person Anirudh; 27.08.2013

Я заменил «exec sp_executesql @sopScript = SQLScript» на «exec sp_executesql @sopScript», и это сработало. Я не знаю, какая разница.

person Anirudh    schedule 27.08.2013