首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server数据库到Excel的动态导出

SQL Server数据库到Excel的动态导出
EN

Stack Overflow用户
提问于 2021-03-24 18:12:42
回答 1查看 141关注 0票数 0

我正在构建一个患者记录导出系统,以便从SQL Server中提取数据。客户需要Excel工作簿形式的数据。

保存数据的方式是动态创建数据库中的表,并根据导出参数更改列名。

我想做的是枚举数据库中的表,然后将这些表(包括列标题)导出(或导入)到Excel中,将这些表导出(或导入)到单个工作簿中的单独工作表中。

所以:-

如果数据库是:

代码语言:javascript
运行
复制
dbo.table1 (name, address, postcode)
dbo.table2 (height, weight, headcirc)

我最终得到了一个Excel工作簿:

代码语言:javascript
运行
复制
Sheet1: Name Address Postcode
Sheet2: Height Weight, Headcirc

目前,我研究过的每种方法都需要Excel事先知道它所接收的数据的结构。对于给定的导出,不可能预先知道表的数量或这些表中列的名称。

例如,OPENROWSET要求Excel工作簿中存在列标题。SSIS似乎需要到SQL表列和Excel工作簿列的固定映射。

我能想到的唯一另一种方法是使用动态BCP过程将所有表导出到CSV,然后看看是否可以找到某种VBA,使我能够将文件夹中的所有CSV文件作为单独的工作表吸收到单个Excel工作簿中-但这似乎非常笨拙。

我相信这一定是可能的--有人做到了吗?什么方法可以工作?

EN

回答 1

Stack Overflow用户

发布于 2021-03-25 10:50:46

可能有多种方法来做这类事情。其中一些技术可能有效,也可能无效,这取决于您的设置、您安装的Excel和SQL Server的版本、您安装的其他软件等。

代码语言:javascript
运行
复制
1) Export data to existing EXCEL file from SQL Server table
insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=D:\testing.xls;', 
    'SELECT * FROM [SheetName$]') select * from SQLServerTable


2) If you don't want to create an EXCEL file in advance and want to export data to it, use
EXEC sp_makewebtask 
    @outputfile = 'd:\testing.xls', 
    @query = 'Select * from Database_name..SQLServerTable', 
    @colheaders =1, 
    @FixedFont=0,@lastupdated=0,@resultstitle='Testing details'

32位和64位驱动程序:

https://www.microsoft.com/en-us/download/details.aspx?id=13255

您可以在Excel中运行此VBA。

代码语言:javascript
运行
复制
Sub TestMacro()

' Create a connection object.
Dim cnPubs As ADODB.Connection
Set cnPubs = New ADODB.Connection

' Provide the connection string.
Dim strConn As String

'Use the SQL Server OLE DB Provider.
strConn = "PROVIDER=SQLOLEDB;"

'Connect to the Pubs database on the local server.
strConn = strConn & "DATA SOURCE=(local);INITIAL CATALOG=Name_of_your_DB;"

'Use an integrated login.
strConn = strConn & " INTEGRATED SECURITY=sspi;"

'Now open the connection.
cnPubs.Open strConn

' Create a recordset object.
Dim rsPubs As ADODB.Recordset
Set rsPubs = New ADODB.Recordset

With rsPubs
    ' Assign the Connection object.
    .ActiveConnection = cnPubs
    ' Extract the required records.
    .Open "SELECT * FROM Categories"
    ' Copy the records into cell A1 on Sheet1.
    Sheet1.Range("A1").CopyFromRecordset rsPubs
    
    ' Tidy up
    .Close
End With

cnPubs.Close
Set rsPubs = Nothing
Set cnPubs = Nothing

End Sub

或者..。

代码语言:javascript
运行
复制
Sub ADOExcelSQLServer()
     
    Dim Cn As ADODB.Connection
    Dim Server_Name As String
    Dim Database_Name As String
    Dim User_ID As String
    Dim Password As String
    Dim SQLStr As String
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
     
    Server_Name = "your_server_name" ' Enter your server name here
    Database_Name = "your_database_name" ' Enter your  database name here
    User_ID = "" ' enter your user ID here
    Password = "" ' Enter your password here
    SQLStr = "SELECT * FROM Orders" ' Enter your SQL here
     
    Set Cn = New ADODB.Connection
    Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _
    ";Uid=" & User_ID & ";Pwd=" & Password & ";"
     
    rs.Open SQLStr, Cn, adOpenStatic
    
    With Worksheets("Sheet1").Range("A1:Z500")
        .ClearContents
        .CopyFromRecordset rs
    End With
    
    rs.Close
    Set rs = Nothing
    Cn.Close
    Set Cn = Nothing
End Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66778845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档