【问题标题】:SQL - Dynamic SQL inside OpenRowSet then Inserted into Temp TableSQL - OpenRowSet 中的动态 SQL 然后插入到临时表中
【发布时间】:2016-09-03 14:44:03
【问题描述】:

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

我目前的错误信息是:

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

消息 7303,第 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)

【问题讨论】:

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


    【解决方案1】:

    虽然我无法重新创建您的文件路径问题(请务必仔细检查路径和文件扩展名中是否存在文件),该设置中的 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$]'');
    

    【讨论】:

    • 感谢您的快速回复! OPENDATASOURCE 解决了我遇到的问题。我只需要在 Data$ 的末尾添加一个勾号,就可以了。
    • 太棒了!很高兴我能帮上忙。但有趣的是第一个不起作用。可能是设置/版本项。
    猜你喜欢
    • 2014-11-03
    • 2010-10-24
    • 2017-09-17
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多