Sql server 2008 r2 SQL Server跳过错误

Sql server 2008 r2 SQL Server跳过错误,sql-server-2008-r2,raiserror,Sql Server 2008 R2,Raiserror,简单的代码。非常奇怪的行为,三次检查这个@filePath和@path是NVARCHAR(260)和@存在是INTdbo.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

简单的代码。非常奇怪的行为,三次检查这个
@filePath
@path
NVARCHAR(260)
@存在
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
中,if块未被调用。相反,只调用if块外部的
RAISERROR

但是如果我将第一个
RAISERROR('A')
替换为
PRINT'blabla'
PRINT语句,则会按预期调用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 server配置不正确

如果您感兴趣,我也会发布
WriteToFile
过程,可能会有所帮助,我从web上获得了此过程,但它工作得非常完美,但可能会产生
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
ALTER过程dbo.WriteToFile
(
@SQL Server 2000中的字符串Varchar(max),--8000
@路径VARCHAR(255),
@文件名VARCHAR(100)
)
作为
开始
声明@objint文件系统
,@objTextStream int,
@objErrorObject int,
@strErrorMessage Varchar(1000),
@命令varchar(1000),
@人力资源部,
@fileAndPath varchar(80)
选择@strErrorMessage='打开文件系统对象'
执行@hr=sp_OACreate'Scripting.FileSystemObject',@objFileSystem OUT
选择@FileAndPath=@path+'\'+@filename
如果@HR=0,请选择@objErrorObject=@objFileSystem,@strErrorMessage='Creating file'+@FileAndPath+''
如果@HR=0,则执行@HR=sp_OAMethod@objFileSystem,'CreateTextFile'
,@objTextStream OUT,@FileAndPath,2,True
如果@HR=0,则选择@objErrorObject=@objTextStream,
@strErrorMessage='writing to file'+@FileAndPath+''
如果@HR=0,则执行@HR=sp_OAMethod@objTextStream,'Write',Null,@String
如果@HR=0选择@objErrorObject=@objTextStream,@strErrorMessage='closing the file'+@FileAndPath+''
如果@HR=0执行@HR=sp_方法@objTextStream,“关闭”
如果@hr0
开始
声明
@源varchar(255),
@描述Varchar(255),
@帮助文件Varchar(255),
@HelpID int
执行sp_OAGetErrorInfo@objErrorObject,
@源输出、@Description输出、@Helpfile输出、@HelpID输出
选择@strErrorMessage='Error while'
+合并(@strErrorMessage,'doing something')
+“,”+合并(@Description,”)
raiserror(@strErrorMessage,16,1)
结束
执行sp_OADestroy@objTextStream
执行sp_OADestroy@objTextStream
结束

编辑:正在运行SQL Server 2008 R2

我不知道您是否真的需要“20”错误级别,但请尝试:

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

我不知道您是否真的需要“20”错误级别,但请尝试:

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