SQL - OpenRowSet中的动态SQL然后插入Temp Table

时间:2016-09-02 21:48:45

标签: sql-server stored-procedures insert execute openrowset

我正在尝试使用将在文件目录中解析为OpenRowSet(@Database)的动态SQL。现在我有一个Excel文件的硬编码目录。最终的结果将是我创建一个应用程序,它将获取用户的文件并导入到SQL表中。从那里我将合并和匹配/不匹配(这是正常工作)。这是拼图的最后一块。我不知道为什么错误消息在" C:\ WINDOWS \ system32 \"

中查找我的文件

我当前的错误消息是:

  

OLE DB提供程序" Microsoft.ACE.OLEDB.12.0"对于链接服务器"(null)"返回消息" Microsoft Access数据库引擎找不到对象' C:\ WINDOWS \ system32 \ C:\ Users \ GrimRieber \ Desktop \ isi test.xlsx'。确保对象存在,并且您正确拼写其名称和路径名称。如果' C:\ WINDOWS \ system32 \ C:\ Users \ GrimRieber \ Desktop \ isi test.xlsx'不是本地对象,请检查您的网络连接或联系服务器管理员。"。

     

Msg 7303,Level 16,State 1,Line 1
  无法初始化OLE DB提供程序的数据源对象" Microsoft.ACE.OLEDB.12.0"对于链接服务器"(null)"。

代码:

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)

1 个答案:

答案 0 :(得分: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$' 

甚至是驱动程序版本(字段可以是两个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$]'');