2016-07-29 2 views
0

WordPressがダウンロードできるようにするファイル(実質的にバックアップコピー)をXMLファイルに格納するプログラムを開発しています。この時点で OPENROWSET:sp_executesql文が@paramで失敗する

私は SQL Serverに私のデータを頻繁にバックアップを許可するようにプロセスを自動化し、何らかの理由で私は XMLファイルが置かれます OPENROWSETを実行するクエリの開発を立ち往生しています。

DECLARE @SQL NVARCHAR(MAX) 
DECLARE @ParamDefinition NVARCHAR(500) = N'@fstring NVARCHAR(MAX)' 
DECLARE @string VARCHAR(MAX) = 
N'C:\[FilePath]\Reviews\thehesperian2016-07-29.xml' 

SET @SQL = 
N'INSERT INTO #Temp (Extract_Date, XMLDATA) 
SELECT GETDATE() 
    , A.* 
FROM OPENROWSET(BULK @fstring, SINGLE_BLOB, CODEPAGE = ' + '''RAW''' + ') AS A' 

EXEC sp_executesql @SQL 
       , @ParamDefinition 
       , @fstring = @string 

エラー:私は述語で、テーブル上の単純なクエリにこれを回すことができるので、私はそれを疑うに足りる理由がある

Msg 102, Level 15, State 1, Line 4 
Incorrect syntax near '@fstring'. 

filepathが読まれる方法です。 私はなぜこれが間違っているのか理解しようとしている私の脳を苦労して数時間を費やしました。私はBULKINSERTにこのexampleのようにQUOTENAMEを使用することもできますが、私は

どうか、なぜ私は、これは間違っているのでしょうか?(これはまだsp_executesqlを使用)、動的SQLでそのすべてを埋め込むために期待していましたかどんな助けでも大歓迎です。 - よろしく、

OPENROWSET - MSDNは、独自の段落で宣言し

ANSWER:私はとにかくいくつかのマイナーなREPLACE機能を実行しなかったが

OPENROWSET does not accept variables for its arguments.

QUOTENAME、十分です。

+0

動的SQLでは、@fstringは変数ではなくリテラルとして認識されています。 – scsimon

+0

@scsimon right、procパラメータでfstringを呼び出すのを忘れてしまったので、SQL Serverはどのように理解しているのか推測するべきではありません。 –

+0

動的SQLの場合、+ '' '@var' "'+を指定してConcatする必要がありますが、OPENROWSET内にあるかどうか不明です。私はそれがうまくいくとは思わない – scsimon

答えて

1

データファイルのパスOPENROWSET関数ではパラメータが許可されません。代わりに、リテラルで必要な文字列を作成:

DECLARE @string varchar(MAX) = N'C:\[FilePath]\Reviews\thehesperian2016-07-29.xml'; 
DECLARE @SQL nvarchar(MAX); 
SET @SQL = 
N'INSERT INTO #Temp (Extract_Date, XMLDATA) 
SELECT GETDATE() 
    , A.* 
FROM OPENROWSET(BULK ' + QUOTENAME(@string, '''') + ', SINGLE_BLOB, CODEPAGE = ''RAW'') AS A'; 
EXEC sp_execute @SQL; 

--EXECUTE(@SQL); 

UPDATE:

追加QUOTENAME提供されたファイルのパスが信頼できないソースから発信された場合には。また、OPENROWSET queries are not autoparameterizedに注意してください。 sp_executesqlまたはEXECUTEのクエリを実行するかどうかは関係ありません。

+0

これは、sp_executesqlを使用していたポイントを無効にします。また、@fstringについて言及していないことに悩まされたのは、procでパラメータと呼ばれています...理論的には、SQLサーバーはそれを変数として扱うことができますか? –

+0

@clifton_hの場合、 'EXEC(@SQL)'の代わりに 'sp_executesql @ SQL'を使うことができますが、それはあなたの好みですが、パラメータなしで行う必要はありません。リテラル文字列のみがファイル名の引数として許可されます。 'OPENROWSET'はパラメータAFAIKを許可しません。 –

+0

'QUOTENAME(@string、NCHAR(39)) 'で最初に変数をクレンジングする必要があるという点を除いて、私はあなたの答えを受け入れます。悪意のある使用を避けるためです。 –

関連する問題