SQL Server пропускает RAISERROR

70
7

Простой код. Очень странное поведение, тройной проверил это. @filePath и @path равны NVARCHAR(260), а @exists - INT. dbo.WriteToFile записывает файл на диск, в этом случае пустой файл.


EXEC master..xp_fileexist @filePath, @exists OUTPUT
print @exists
IF @exists = 0
BEGIN
EXEC dbo.WriteToFile N'', @path, @filename
RAISERROR('A', 20, -1) WITH log
END
RAISERROR('B', 20, -1) WITH log

Когда я запускаю этот код в первый раз, а @exists равен 0, он переходит в блок if. Файл создается, как ожидалось. Подтвердил это. Но RAISERROR в, если блок не. Вместо этого вызывается только RAISERROR вне блока if.


Но если я заменил первый RAISERROR ('A') на PRINT 'blabla', оператор print вызывается как ожидалось.


Если я заменил @exists = 0 на 1 = 1 и сохранил первый RAISERROR ('A') как есть, снова все ведет себя правильно и вызывается первый RAISERROR ('A').


Может кто-нибудь объяснить это?


О да, и почему


print 'bla'
raiserror('bla', 20, -1) with log

в новом окне запроса получите мне это:


bla
Meldung 2745, Ebene 16, Status 2, Zeile 3
Der Prozess mit der ID 54 hat den Benutzerfehler 50000, Schweregrad 20, ausgelöst. Dieser Prozess wird von SQL Server beendet.
bla
Meldung 2745, Ebene 16, Status 2, Zeile 3
Der Prozess mit der ID 54 hat den Benutzerfehler 50000, Schweregrad 20, ausgelöst. Dieser Prozess wird von SQL Server beendet.

Это 2 раза то же сообщение. Может быть, мой SQL-сервер настроен неправильно?


Я также опубликую процедуру WriteToFile, если вам интересно, может быть, это помогает, у меня есть эта процедура из Интернета, но она работает отлично, но, возможно, она вызывает поведение RAISERROR:


ALTER PROCEDURE dbo.WriteToFile
(
@String Varchar(max), --8000 in SQL Server 2000
@Path VARCHAR(255),
@Filename VARCHAR(100)
)
AS
BEGIN
DECLARE @objFileSystem int
,@objTextStream int,
@objErrorObject int,
@strErrorMessage Varchar(1000),
@Command varchar(1000),
@hr int,
@fileAndPath varchar(80)

select @strErrorMessage='opening the File System Object'
EXECUTE @hr = sp_OACreate 'Scripting.FileSystemObject' , @objFileSystem OUT

Select @FileAndPath=@path+'\'+@filename
if @HR=0 Select @objErrorObject=@objFileSystem , @strErrorMessage='Creating file "'+@FileAndPath+'"'
if @HR=0 execute @hr = sp_OAMethod @objFileSystem , 'CreateTextFile'
, @objTextStream OUT, @FileAndPath,2,True

if @HR=0 Select @objErrorObject=@objTextStream,
@strErrorMessage='writing to the file "'+@FileAndPath+'"'
if @HR=0 execute @hr = sp_OAMethod @objTextStream, 'Write', Null, @String

if @HR=0 Select @objErrorObject=@objTextStream, @strErrorMessage='closing the file "'+@FileAndPath+'"'
if @HR=0 execute @hr = sp_OAMethod @objTextStream, 'Close'

if @hr<>0
begin
Declare
@Source varchar(255),
@Description Varchar(255),
@Helpfile Varchar(255),
@HelpID int

EXECUTE sp_OAGetErrorInfo @objErrorObject,
@source output,@Description output,@Helpfile output,@HelpID output
Select @strErrorMessage='Error whilst '
+coalesce(@strErrorMessage,'doing something')
+', '+coalesce(@Description,'')
raiserror (@strErrorMessage,16,1)
end
EXECUTE sp_OADestroy @objTextStream
EXECUTE sp_OADestroy @objTextStream
END


изменить: запуск SQL Server 2008 R2

спросил(а) 2012-08-23T19:40:00+04:00 8 лет, 1 месяц назад
1
Решение
114

Я не знаю, действительно ли вам нужен уровень ошибки "20", но, пожалуйста, попробуйте:

RAISERROR('A', 16, -1) WITH log

ответил(а) 2012-08-25T10:11:00+04:00 8 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема