シンプルなコード。非常に奇妙な動作です。これをトリプルチェックしました。@filePath
と@path
はNVARCHAR(260)
と@exists
です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ブロックでは呼び出されません。代わりRAISERROR
に if ブロックの外側だけが呼び出されます。
しかし、最初のステートメントを print ステートメントに置き換えるRAISERROR ('A')
とPRINT 'blabla'
、期待どおりに呼び出されます。
@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
ます。役立つかもしれません。この手順は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
編集: SQL Server 2008 R2 の実行