【问题标题】:SQL Server OPENROWSET Select From Excel TableSQL Server OPENROWSET 从 Excel 表中选择
【发布时间】:2021-01-15 18:03:58
【问题描述】:

我正在尝试将 Excel(xlsx) 文件解析为 SQL Server。一张表中有很多表,我不确定如何处理。

我知道我可以用这个拉整个工作表:

SELECT *
    FROM OPENROWSET
    (
        'Microsoft.ACE.OLEDB.12.0',
        'Excel 12.0; Database=\\afcn2011\root\DATA\VisualCron\SharePoint\Templates\Kitchen+Bar Inventory.xlsx; HDR=NO; IMEX=1',
        'SELECT * FROM [Inventory$]'
    )

但我希望有一种方法可以从工作表中的特定表格中进行选择?

例如,我为每种酒都有一张桌子;伏特加、杜松子酒、波旁酒等,它们都被命名为“VodkaTable”、“GinTable”、“BourbonTable”等。

有没有办法只从该特定表中进行选择?请记住,范围会随着时间而改变,所以我不能只说 $A10:$B20 或类似的东西。 但是像这样:

SELECT *
    FROM OPENROWSET
    (
        'Microsoft.ACE.OLEDB.12.0',
        'Excel 12.0; Database=\\afcn2011\root\DATA\VisualCron\SharePoint\Templates\Kitchen+Bar Inventory.xlsx; HDR=NO; IMEX=1',
        'SELECT * FROM [Inventory$VodkaTable]'
    )

我现在也试过了: 我定义了一个引用 Vodka 表的名称,称为“VodkaData”:

然后我使用了这个查询:

SELECT *
    FROM OPENROWSET
    (
        'Microsoft.ACE.OLEDB.12.0',
        'Excel 12.0; Database=\\afcn2011\root\DATA\VisualCron\SharePoint\Templates\Kitchen+Bar Inventory.xlsx; HDR=NO; IMEX=1',
        'SELECT * FROM [VodkaData]'
    )

但我收到此错误:

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "The Microsoft Access database engine could not find the object 'VodkaData'. Make sure the object exists and that you spell its name and the path name correctly. If 'VodkaData' is not a local object, check your network connection or contact the server administrator.".
Msg 7350, Level 16, State 2, Line 1
Cannot get the column information from OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

【问题讨论】:

    标签: sql-server excel


    【解决方案1】:

    您需要在工作表中定义named range

    然后您可以使用OPENROWSET 访问它,如下所示:
    'SELECT * FROM [MyNamedRange]'

    顺便说一句,除非您确实需要,否则我会真的避免从 T-SQL 执行此操作。 SSIS 和其他工具更适合。

    【讨论】:

    • 我在我的问题中添加了更多细节,因为我刚刚尝试过这个,但我得到了一个错误。
    • SELECT * FROM [Worksheet:MyNamedRange]?见stackoverflow.com/questions/15731047/…
    • 对不起SELECT * FROM [Worksheet$MyNamedRange]
    • 是的,这实际上是我认为你的意思,所以我也尝试过,但同样的问题。我目前正在尝试本地登录到保存该文件的服务器,以查看它是否是某种权限。
    • 即使在本地它仍然无法正常工作。可能必须使用 SSIS 解决方案。只是不太熟悉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2012-08-15
    • 2015-09-07
    相关资源
    最近更新 更多