簡單代碼。很奇怪的行爲,三重檢查了這一點。 @filePath
和@path
是NVARCHAR(260)
和@exists
是INT
。 dbo.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