2

简单的代码。非常奇怪的行为,三重检查了这一点。@filePath并且@pathNVARCHAR(260)并且@existsINTdbo.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 块中没有被调用。而是只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

4

1 回答 1

0

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

RAISERROR('A', 16, -1) WITH log
于 2012-08-25T07:11:10.753 回答