2016-09-02 8 views
0

ファイルディレクトリで解析される動的SQLをOpenRowSet(@Database)に使用しようとしています。今私は、Excelファイル用のハードコーディングされたディレクトリを持っています。最終的には、ユーザーのファイルを取得してSQLテーブルにインポートするアプリケーションを作成します。そこから私はマージされ、一致/不一致(正しく動作しています)です。これはパズルの最後の部分です。エラーメッセージがで私のファイルを探している理由を私は知らない "C:\ WINDOWS \ SYSTEM32 \"OpenRowSet内の動的SQLがTempテーブルに挿入されました

私の現在のエラーメッセージは次のとおりです。

OLE DBプロバイダ「Microsoft.ACE.OLEDB。 Microsoft Accessデータベースエンジンが 'C:¥WINDOWS¥system32¥C:¥Users¥GrimRieber¥Desktop¥isi test.xlsx'というオブジェクトを見つけることができませんでした。 'C:¥WINDOWS¥system32¥C:¥Users¥GrimRieber¥Desktop¥isi test.xlsx'がローカルオブジェクトでない場合は、ネットワーク接続を確認するか、サーバーに連絡してください管理者。 "

メッセージレベル7、レベル16、状態1、行1
リンクサーバー "(null)"のOLE DBプロバイダ "Microsoft.ACE.OLEDB.12.0"のデータソースオブジェクトを初期化できません。

コード:

declare @Database varchar(max) 

select @Database = 'C:\Users\GrimRieber\Desktop\isi test.xlsx' 

declare @sql varchar(Max) 

select @sql = 'SELECT * FROM OPENROWSET(
''Microsoft.ACE.OLEDB.12.0'', 
''Excel 12.0; Database= ' + @Database + '; HDR=YES; IMEX=1'', 
''SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num],[01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[Year]FROM [Data$]'' 
)' 

IF OBJECT_ID('tempdb.dbo.#TempScorecardInventorySold', 'U') IS NOT NULL 
    DROP TABLE #TempScorecardInventorySold; 

CREATE TABLE #TempScorecardInventorySold 
(
    [Vendor] [varchar](50) NULL, 
    [VendorName] [varchar](50) NULL, 
    [Material] [varchar](50) NULL, 
    [MaterialName] [varchar](50) NULL, 
    [Supplier Stock Num] [varchar](50) NULL, 
    [01] [nVarchar](50) NULL, 
    [02] [nVarchar](50) NULL, 
    [03] [nVarchar](50) NULL, 
    [04] [nVarchar](50) NULL, 
    [05] [nVarchar](50) NULL, 
    [06] [nVarchar](50) NULL, 
    [07] [nVarchar](50) NULL, 
    [08] [nVarchar](50) NULL, 
    [09] [nVarchar](50) NULL, 
    [10] [nVarchar](50) NULL, 
    [11] [nVarchar](50) NULL, 
    [12] [nVarchar](50) NULL, 
    [Year] [Int] Null 
) ON [PRIMARY]; 

INSERT INTO [dbo].#TempScorecardInventorySold ([Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num],[01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[Year]) 
EXECUTE(@sql) 

答えて

0

私は(ファイルパスとファイル拡張子に存在する場合は慎重に確認してください)あなたのファイルパスの問題を再作成することはできませんが、その設定でOPENROWSET()は、内のフィールドを定義する必要がありますSELECT句の先頭に。最後の引数は、範囲をワークシートに指して、引用符で囲まなければなりません:

select @sql = 'SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num], 
         [01],[02],[03],[04],[05],[06], 
         [07],[08],[09],[10],[11],[12],[Year] 
       FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', 
       ''Excel 12.0; Database= ' + @Database + '; HDR=YES; IMEX=1'', [Data$])'; 

また、OPENDATASOURCE考える:

select @sql = 'SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num], 
         [01],[02],[03],[04],[05],[06], 
         [07],[08],[09],[10],[11],[12],[Year] 
       FROM OPENDATASOURCE(''Microsoft.ACE.OLEDB.12.0'', 
       ''Data Source=' + @Database + ';Extended Properties=Excel 12.0'')...Data$' 

、あるいはドライバのバージョンを(フィールドは2 SELECT節のいずれかにすることができます)

select @sql = 'SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num], 
         [01],[02],[03],[04],[05],[06], 
         [07],[08],[09],[10],[11],[12],[Year] 
       FROM OPENROWSET(''MSDASQL'', 
       ''Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}; 
       DBQ=' + @Database + ''', ''SELECT * FROM [DATA$]''); 
+0

ありがとうございました! OPENDATASOURCEは私が持っていた問題を解決しました。私はちょうどデータ$の最後に目盛りを加えなければならず、それはすべてうまくいった。 –

+0

素晴らしい!お役に立てて嬉しいです。しかし、興味深いのは、最初はうまくいきません。設定/バージョン項目である可能性があります。 – Parfait

関連する問題