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