从Excel更新SQL表而不创建临时表

时间:2016-06-23 21:32:37

标签: sql sql-server excel

我在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

是否可以编写脚本来将管理员从管理员更改为管理员更改,是否可以在不创建临时表的情况下执行此操作?

1 个答案:

答案 0 :(得分:0)

考虑使用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]

或者,考虑使用ADO在VBA中进行参数化查询,您可以在更新查询命令中迭代绑定旧数字和新数字。下面循环遍历工作表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