【问题标题】:Update SQL table from Excel without creating a temporary table从 Excel 更新 SQL 表而不创建临时表
【发布时间】:2016-06-23 21:32:37
【问题描述】:

我在 MS SQL Server 2012 中有一个表,看起来像下面显示的但有数百条记录

id   | adminnumber  |
1      006              
2      012
3      239
4      546
5      123
6      637

我有一个 excel 表,其中包含对 adminnumber 字段的这数百条记录的建议更新,因此该表包含类似

adminnumber original  | adminnumber change
006                     673 
012                     134
239                     435
546                     783
123                     347
637                     903

是否可以编写脚本将 adminnumber 从原始 adminnumber 更新为 adminnumber 更改,是否可以在不创建临时表的情况下这样做?

【问题讨论】:

  • 是的,这是可能的,是的,这是可能的。您是否尝试过任何方法来解决此问题?如果是这样,请提供您尝试过的方法并解释您发现哪些方法不起作用。
  • 当然:(1) 将每条记录的 SQL update 发送到服务器 (2) 使用表变量(而不是临时表)聚合所有更新。但是,此选项一次限制为 1,000 个更新 (3) 创建一个 SSIS 包并根据请求通过 Excel VBA 执行它,(4) 将所有更新导出到 CSV,将该 CSV 上传到共享位置可用于 SQL 服务器,然后使用 OpenRowSetBULK INSERT 在服务器上更新...这些只是您拥有的多个选项中的一些...。尝试更具体。否则,我们无能为力。
  • @Ralph 谢谢我怎样才能达到 1 或 2?理想情况下,我只想运行 1 个查询来更新所有
  • 只有一个查询?如果您只有 1,000 条记录(或更少)要更新,那么它将与表变量一起使用。否则,您将不得不向服务器发送多个 SQL 语句(每组 1,000 条)。要使用 VBA 建立与 SQL 的连接,您可以使用:stackoverflow.com/questions/30289095/… 要为 SQL 语句动态创建表变量,您可以使用:stackoverflow.com/questions/37861150/…
  • @Ralph 非常感谢非常有帮助!

标签: sql sql-server excel


【解决方案1】:

考虑使用 SQL Server 的 OPENDATASOURCEOPENROWSET 函数通过 distributed queries 直接连接到工作簿:

UPDATE TableName
SET t.adminnumber = s.[adminnumber change]
FROM TableName t    
INNER JOIN    
    OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
        'Data Source=C:\Path\To\Workbook.xls;Extended Properties=Excel 8.0')...Sheet$ s    
ON t.adminnumber = s.[adminnumber original]

或者,考虑在 VBA 中使用 ADO 进行参数化查询,您可以在更新查询命令中迭代地绑定新旧数字。下面循环遍历工作表 1 中的 A 列和 B 列:

Public Sub UpdateSQL()
    Dim conn As Object, cmd As Object
    Dim constr As String, strSQL As String
    Dim adCmdText As Integer: adCmdText = 1
    Dim adInteger  As Integer: adInteger = 3
    Dim adParamInput As Integer: adParamInput = 1
    Dim i As Integer, lastrow As Long    

    ' OPEN DB CONNECTION '
    Set conn = CreateObject("ADODB.Connection")
    constr = "DRIVER={SQL Server};server=servername;database=databasename;" _
                   & "UID=username;PWD=password;"
    conn.Open constr

    strSQL = "UPDATE [TableName] SET [adminnumber] = ?" _
              & " WHERE [adminnumber] = ?"    
    lastrow = Worksheets(1).Cells(Worksheets(1).Rows.Count, "A").End(xlUp).Row

    For i = 2 To lastrow        
        ' SETTING COMMAND
        Set cmd = CreateObject("ADODB.Command")
        With cmd
            .ActiveConnection = conn
            .CommandText = strSQL
            .CommandType = adCmdText
            .CommandTimeout = 15
        End With            
        ' BINDING PARAMETERS
        cmd.Parameters.Append cmd.CreateParameter("newNum", adInteger, adParamInput, 3)
        cmd.Parameters(0).Value = Worksheets(1).Range("B" & i)
        cmd.Parameters.Append cmd.CreateParameter("oldNum", adInteger, adParamInput, 3)
        cmd.Parameters(1).Value = Worksheets(1).Range("A" & i)
        'EXECUTE QUERY
        cmd.Execute
    Next i    

    conn.Close        
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2017-11-16
    • 2019-03-13
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    相关资源
    最近更新 更多