2012-08-23 96 views
2

簡單代碼。很奇怪的行爲,三重檢查了這一點。 @filePath@pathNVARCHAR(260)@existsINTdbo.WriteToFile將文件寫入磁盤,本例中爲空文件。SQL Server跳過RAISERROR

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時,它進入如果塊。文件按預期創建。證實了這一點。但RAISERROR如果塊是不是調用。而只調用if塊外部的RAISERROR

但是,如果我將第一個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 @[email protected]+'\'[email protected] 
if @HR=0 Select @[email protected] , @strErrorMessage='Creating file "'[email protected]+'"' 
if @HR=0 execute @hr = sp_OAMethod @objFileSystem , 'CreateTextFile' 
    , @objTextStream OUT, @FileAndPath,2,True 

if @HR=0 Select @[email protected], 
    @strErrorMessage='writing to the file "'[email protected]+'"' 
if @HR=0 execute @hr = sp_OAMethod @objTextStream, 'Write', Null, @String 

if @HR=0 Select @[email protected], @strErrorMessage='closing the file "'[email protected]+'"' 
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

回答

0

我不知道你是否真的需要一個 「20」 的錯誤水平,但請嘗試:

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