Если вы не можете пройти по коду, есть два способа:
# 1 объединить строку и вставить в файл журнала.
Объявить переменную как:
DECLARE @Loginfo varchar(7500)
добавляйте отладочную информацию в него по мере прохождения кода:
SET @LogInfo=ISNULL(@LogInfo)+'#01> @x='+COALESCE(CONVERT(varchar(10),@x),'NULL')
..
SET @LogInfo=ISNULL(@LogInfo)+'#02>'
..
SET @LogInfo=ISNULL(@LogInfo)+'#03> top loop'
во всех точках выхода (после любых откатов) добавить:
ВСТАВИТЬ В ЗНАЧЕНИЯ YourLogTable (..., @ LogInfo)
В зависимости от использования транзакции и, в частности, вашей ошибки, вы можете просто вставить много раз, не опасаясь отката, поэтому вам придется изменить это в вашей ситуации.
# 2 запись в текстовый файл на сервере sq
это может быть не вариант, поскольку он использует очень небезопасную хранимую процедуру xp_cmdshell. Однако, если вы можете использовать это и если транзакции из вызывающего приложения вызывают проблемы, попробуйте создать эту хранимую процедуру:
CREATE PROC log_message
@Message varchar(255)
,@FileName varchar(100)
,@OverWrite char(1) = 'N'
AS
/*
Log messages to server side text files from stored procedures/triggers/sql scripts
Input parameters:
Message - message to put in the log file
FileName - path and name of the file to log the message into
OverWrite - 'Y'=overwrite entire file with current message
'N'=append current message onto end of file
Return code:
0 - everything was fine
1 - there was an error
NOTE: the command to log the message can not be longer than 255 characters,
as a result the message and file name should be less than 245 chars combined
Example: EXEC log_message 'Duplicates found','C:\logfile.txt', 'N'
append the "Duplicates found" message onto the server's "C:\logfile.txt" file
*/
BEGIN
SET NOCOUNT ON
DECLARE @ExecuteString VARCHAR(255) --command string can only be 255 chars long
DECLARE @ReturnValue int
--build command string
SET @ExecuteString = RTRIM('echo ' + COALESCE(LTRIM(@Message),'-')
+ CASE WHEN (@OverWrite = 'Y') THEN ' > ' ELSE ' >> ' END + RTRIM(@FileName))
--run command string
EXEC @ReturnValue=master..xp_cmdshell @ExecuteString
--IF @ReturnValue!=0
-- PRINT 'command failed, return value='+CONVERT(varchar(40),@ReturnValue)
RETURN @ReturnValue
SET NOCOUNT OFF
END
посылать вызовы этой процедуры, они через ваш код записывают то, что вам нужно, в файл на сервере