我在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
是否可以编写脚本来将管理员从管理员更改为管理员更改,是否可以在不创建临时表的情况下执行此操作?
答案 0 :(得分:0)
考虑使用SQL Server的OPENDATASOURCE
或OPENROWSET
函数与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