2016-06-17 4 views
3

私は、入力を渡すことができるストアドプロシージャを使用してTransact-SQLでファイルに書き込もうとしています。ただし、SQL Server 2012でコマンドを実行するたびにCommand(s) completed successfully.と表示されますが、テキストファイルに移動してもテキストは表示されません。どんなアイデアが間違っている可能性がありますか?sp_OAMethodを使用してテキストファイルに書き込むときに何も表示されない

マイコード:

 
    -- GRANTS PERMISSION TO OLE AUTOMATION -- 
    sp_configure 'show advanced options', 1; 
    GO 
    RECONFIGURE; 
    GO 
    sp_configure 'Ole Automation Procedures', 1; 
    GO 
    RECONFIGURE; 
    GO 

    DROP PROC WriteToGSQL; 

    -- ENCAPSULATING THE SPECIFIC CODE THAT DOES THE ACTUAL WRITING TO THE TEXT FILE -- 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    CREATE PROC [dbo].[WriteToGSQL] 

    @Path  VARCHAR(2000), 
    @Text  VARCHAR(2000) 

    AS 

    BEGIN 

    DECLARE @Auto INT 
    DECLARE @FileID INT 

    EXECUTE sp_OACreate 'Scripting.FileSystemObject', @Auto OUT 
    EXECUTE sp_OAMethod @Auto, 'OpenTextFile', @FileID OUT, @Path, 8, 1 
    EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, @Text 
    EXECUTE sp_OADestroy @FileID 
    EXECUTE sp_OADestroy @Auto 

    END 

    DECLARE @File VARCHAR(2000); 
    DECLARE @Txt VARCHAR(2000); 

    SET @File = 'C:\xxxxxxxx\xxxx\test.txt'; 
    SET @Txt = 'Did it work?'; 

    EXEC WriteToGSQL @File, @Txt; 
+3

あなたは 'sp_OACreate'と' sp_OAMethod'への呼び出しの戻り値をチェックしていないので、何かが間違っているかどうかを確認する方法はありません。 'sp_OAGetErrorInfo'と一緒に戻り値を使用してください。サンプルについては、[MSDN](https://msdn.microsoft.com/library/ms174984)を参照してください。 –

+0

明らかに「間違っている」のは、テキストファイルで 'Close'を呼び出さないことです。 'sp_OADestroy'を呼び出すだけでオブジェクトが取り除かれ、ストリームが内容をフラッシュするのを防ぐことができます。 (私は実際にそれを使用している経験がないので、これは推測です。) –

+0

@JeroenMostert応答いただきありがとうございます。私はお詫びします、私はTSQLに慣れていないので、私はsp_OAの機能にあまり慣れていません。私はMSDNの例を見ましたが、運がないと、あなたが意味することを私に見せることは可能でしょうか? –

答えて

2

@JeroenMostertが正しい方向にあなたを指しているため、信用に値する、私はちょうどに沿ってあなたを助けるためにSQLの中に彼の言葉を入れている(と私はSSMSせずにそれをやっていますあなたは少しそれをつまむ必要があるかもしれないので、手に)。

Jeroenのポイントを繰り返し処理するには、戻り値をチェックして各sp_OA ...呼び出しが機能することを確認し、オブジェクトを破棄する前にファイルのCloseメソッドを呼び出す必要があります。さらに詳しい情報は、FileSystemObjectのMSDNドキュメントをご覧ください。

DECLARE @hr int; 

EXECUTE @hr = sp_OACreate 'Scripting.FileSystemObject', @Auto OUT 
IF @hr <> 0 
BEGIN 
    RAISERROR('Error %d creating object.', 16, 1, @hr) 
    RETURN 
END 

EXECUTE @hr = sp_OAMethod @Auto, 'OpenTextFile', @FileID OUT, @Path, 8, 1 
IF @hr <> 0 
BEGIN 
    RAISERROR('Error %d opening file.', 16, 1, @hr) 
    RETURN 
END 

EXECUTE @hr = sp_OAMethod @FileID, 'WriteLine', Null, @Text 
IF @hr <> 0 
BEGIN 
    RAISERROR('Error %d writing line.', 16, 1, @hr) 
    RETURN 
END 

EXECUTE @hr = sp_OAMethod @FileID, 'Close', Null, Null 
IF @hr <> 0 
BEGIN 
    RAISERROR('Error %d closing file.', 16, 1, @hr) 
    RETURN 
END 

EXECUTE @hr = sp_OADestroy @FileID 
EXECUTE @hr = sp_OADestroy @Auto 
+0

私はこれを試しましたが、「エラー-2146828218ファイルを開く」というエラーが表示されます。 –

+0

-2146828218は16進数で800A0046です(Googleによると)おそらく許可拒否応答です。これはクライアントコンピュータではなく、SQL Serverコンピュータ上で実行されていることを覚えておいてください。@Pathはサーバー上にあり、SQL Serverサービスアカウントはパスを作成するためのアクセス許可が必要です。 –

+0

お返事ありがとうございます!うん、私はそれがパーミッションエラーであると思った:/。どのようにすれば、ファイルを作成するためにSQL Serverサービスアカウントを提供するのですか? –

関連する問題