1

別のサーバーの共有ドライブにマップする一時ドライブをデータベースサーバーに作成することにより、BCPを使用してネットワークドライブにファイルを書き込むことができるストアドプロシージャがあります。正常に動作していますが、最後のEXECコマンドからエラーが返さThere are open files and/or incomplete directory searches pending on the connection to U:.れます。これは、ファイルの書き込みが完了する前に、ドライブの削除コマンドを実行しようとしていると推測していることを示しています。procの実行後にステートメントを実行すると、ドライブが正常に削除されます。手順は次のとおりです。

CREATE PROCEDURE dn_ExportFile
    @ServerName varchar(50),
    @ServerPath varchar(500),
    @FileName varchar(100),
    @Query varchar(max),
    @UserName varchar(100),
    @Password varchar(100),
    @Drive varchar(1) = 'U'
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @cmd VARCHAR(8000)

    --Set up virtual drive pointing to desired path
    SET @cmd = 'NET USE ' + @Drive + ': ' + @ServerPath + ' /user:' + @ServerName + '\' + @UserName + ' ' + @Password
    PRINT @cmd
    EXEC xp_cmdshell @cmd

    --Export data using BCP to virtual drive
    SET @cmd = 'BCP "' + @Query + '" QUERYOUT "' + @Drive + ':\' + @FileName + '" -c -t -T'
    PRINT @cmd
    EXEC xp_cmdshell @cmd

    --Delete virtual drive
    SET @cmd = 'NET USE ' + @Drive + ': /delete'
    PRINT @cmd
    EXEC xp_cmdshell @cmd
END

ストアドプロシージャ内の一時ドライブを正常に削除する方法はありますか?

4

1 に答える 1

2

呼び出し元のプロシージャがまだスコープ内にある間は、発生しないと思われます。したがって、次のようなラッパー ストアド プロシージャを試すことができます。

EXEC dbo.dn_ExportFile ...;

SET @cmd = 'NET USE ' + @Drive + ': /delete';
PRINT @cmd;
EXEC xp_cmdshell @cmd;

そうでなければ、あなたは間違った場所でこれをやっていると思います。このプロシージャを呼び出すプログラムに、コマンドを呼び出してパスを指定させます。

于 2012-06-25T19:22:13.060 に答える