2016-09-10 2 views
1

私は正しいExcelファイルを取得するためにPathを渡すことができるこのOpenrowset Queryを持っています。私は引用符の正確な数や型変換を把握できませんOpenrowsetクエリでDate変数を渡す

WHEREステートメントを渡して、テーブルの特定の日付を取得する必要があります。私はあなたが2つの引用符と2 &を置くVBAから来て、あなたはすべて設定されています。 SQLには何百ものものが必要です!

set @sql1 = 'select * 
      FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', 
         ''Excel 12.0;Database=' + @filePath1 + '' + ';' + '''' + ', 
      ''Select * from [Sheet1$] '''+')' 

exec(@sql1) 

(誰かがあまりにも理解されるだろうとSQLの引用符についてのオンライン大学へのリンクを持っている場合)私はWHERE DATE = @PnLDate

答えて

0

ルールは、あなたが知っていると非常によく似ていますが、それを追加したいです一重引用符'に適用されます。それらのうちの1つを文字列の中に入れたい場合はを2つ使用して''をエスケープします。それらを除いて、あなたはオープン用のものとクローズ用のものがなければなりません。

あなたが表示する文字列は、空の空文字列が含まれているためちょっと複雑になっています。あなたの文字列のsimiplificatedバージョンの下:あなたの要求where

set @sql1 = 'select * 
     FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', 
      ''Excel 12.0;Database=' + @filePath1 + ';'', 
      ''Select * from [Sheet1$] '')' 

ことがあります

DECLARE @PnLDate datetime  -- may be varchar instead, if so, must remove convert(....) and use straight @PnLDate 
set @PnLDate = '2014/08/01' 

set @sql1 = 'select * 
     FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', 
      ''Excel 12.0;Database=' + @filePath1 + ';'', 
      ''Select * from [Sheet1$] where DATE = #'+  -- hash # is MS Access delimiter for dates 
      convert(varchar(25), @PnLDate, 111) 
      +'#'')'          -- results in #2014/08/01# 

は、あなたが「動的SQL」を使用するときに、あなたのデータは、文字列に悪質なコードを挿入できることを注意してください。 セットする@ SQL1は= 'OPENROWSET FROM SELECT *('(PnLDate @、NVARCHAR(MAX))に変換 ` セット@PnLDate = 'Microsoft.ACE.OLEDB.12.0:このメソッドを使用する方法についてsql Injection

+0

を読みます''、 '' エクセル12.0;データベース= '+ @ filePath1 + ';''、 '' を選択* DDate = '+ @PnLDate +' [Sheet1の$]から ''「) ' 私は データ型nvarchar(max)と日付が、add演算子で互換性がありません。 – Rich

+0

@PnLDateを文字列に変換する必要があるというエラーが発生します。 (SQLサーバーが自動的に連結してその型を調べるのはほんのわずかなことですが、datetimeはそうではありません)。結果として得られる文字列は、有効なSQL文でなければなりません。あなたのケースでは、 'DDate = 12/31/2015'のように日付定数の周りに必要な引用符がないと読んでしまうかもしれません。私の編集した例の変換とsorroundへの追加引用符を参照してください –

+0

大変ありがとうございますが、私はこれで運がありません 'DECLARE @PnLDate varchar(25)'の型を変更しました。 _ 'set @PnLDate = 08/01/2014' 次に、私はあなたのクエリを使用しました。 _ [Select * from [Sheet1 $] where DATE =" 08-01-2014 " 「OLE DBプロバイダに対して は、私はまた、二重引用符を削除しようとしたと私は日付の数値を使用している場合、それはまだ – Rich

関連する問題