【问题标题】:Get Excel sheet name In SQL Server在 SQL Server 中获取 Excel 工作表名称
【发布时间】:2011-09-16 00:51:04
【问题描述】:

如何使用 SQL Sever 2005 获取 Excel 文件中的工作表名称?

请注意:

  • 没有前端(C#、VB、PHP等);
  • 我正在尝试仅使用 SQL Server 2005 来获取工作表名称。

谢谢。

【问题讨论】:

    标签: sql-server excel sql-server-2005 worksheet


    【解决方案1】:

    这样做至少有两种可能性。我事先承认,我没有简单的方法在 SQL Server 2005 中检查这一点,现在只有 2008 年。

    1:创建链接服务器并使用sp_tables_ex 和/或sp_columns_ex

    -- Get table (worksheet) or column (field) listings from an excel spreadsheet
    
    -- SET THESE!
    declare @linkedServerName sysname = 'TempExcelSpreadsheet'
    declare @excelFileUrl nvarchar(1000) = 'c:\MySpreadsheet.xls'
    -- /SET
    
    -- Remove existing linked server (if necessary)
    if exists(select null from sys.servers where name = @linkedServerName) begin
        exec sp_dropserver @server = @linkedServerName, @droplogins = 'droplogins'
    end
    
    -- Add the linked server
    -- ACE 12.0 seems to work for both xsl and xslx, though some might prefer the older JET provider
    exec sp_addlinkedserver
        @server = @linkedServerName,
        @srvproduct = 'ACE 12.0',
        @provider = 'Microsoft.ACE.OLEDB.12.0',
        @datasrc = @excelFileUrl,
        @provstr = 'Excel 12.0;HDR=Yes'
    
    -- Grab the current user to use as a remote login
    declare @suser_sname nvarchar(256) = suser_sname()
    
    -- Add the current user as a login
    exec sp_addlinkedsrvlogin
        @rmtsrvname = @linkedServerName,
        @useself = 'false',
        @locallogin = @suser_sname,
        @rmtuser = null,
        @rmtpassword = null
    
    -- Return the table/column info
    exec sp_tables_ex @linkedServerName
    exec sp_columns_ex @linkedServerName
    
    -- Remove temp linked server
    if exists(select null from sys.servers where name = @linkedServerName) begin
        exec sp_dropserver @server = @linkedServerName, @droplogins = 'droplogins'
    end
    

    我找到了这个here的灵感。

    2:使用here 概述的 Ole 自动化程序。这个我自己没试过。

    【讨论】:

      【解决方案2】:

      你不能。从 Excel 读取数据有两种途径。一种是COM/OLE automation 路由,它允许您枚举工作簿中的工作表。这需要一种 TSQL 不会做的过程语言。我什至不认为如果您允许 CLR 方法混合使用,您将能够访问 Office 库,因为它们不在 BCL 列表中。

      在这种情况下,第二种方法是通过 openquery 使用Jet driver,但作为设置的一部分,您需要明确定义要访问的文件和工作表。您可以放弃列出工作表名称,但即便如此,Excel 也不会根据我的猜测公开有关工作表的元数据。

      如果有人知道另一种方法,但我以多种方式解决了这个问题,我将删除这个答案,我没有想出一个不归结为上述两种方法之一的答案。

      【讨论】:

      • 我正在考虑CLR方法...虽然我还需要做一些进一步的研究和研究。谢谢。
      • @billinkc,这显然是旧的,但我想我可能偶然发现了一两个方法。
      【解决方案3】:

      从蒂姆的回答中充实选项 2 - Ole 自动化程序,因为该链接现在已失效。您可以使用如下代码执行此操作:

      declare @FilePath varchar(max) = '[Excel File].xlsx'
      declare @ConnectionString varchar(max) = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+@FilePath+';Extended Properties=''Excel 12.0;HDR=Yes'''
      declare @r int, @objConnection int, @objRecordSet int
                exec @r = sp_OACreate 'ADODB.Connection', @objConnection output
      if @r = 0 exec @r = sp_OAMethod @objConnection, 'Open', null, @connectionstring
      if @r = 0 exec @r = sp_OAMethod @objConnection, 'OpenSchema', @objRecordSet output, 20
      if @r = 0 exec @r = sp_OAGetProperty @objRecordSet, 'GetRows'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多