2

シンプルなコード。非常に奇妙な動作です。これをトリプルチェックしました。@filePath@pathNVARCHAR(260)@existsです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 log
END
RAISERROR('B', 20, -1) WITH log

このコードを初めて実行して@exists0 になると、if ブロックに入ります。ファイルは期待どおりに作成されます。ことを確認した. しかしRAISERROR ifブロックでは呼び出されません。代わりRAISERRORに if ブロックの外側だけが呼び出されます。

しかし、最初のステートメントを print ステートメントに置き換えるRAISERROR ('A')PRINT 'blabla'、期待どおりに呼び出されます。

@exists = 01=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 の実行

4

1 に答える 1

0

本当に「20」のエラーレベルが必要かどうかはわかりませんが、次のことを試してください。

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