我有一个包含以下代码的 Excel 工作簿 -
Sub Button1_Click()
Dim conn As New ADODB.Connection
Dim iRowNo As Integer
Dim sFirstName, sLastName As String
With Sheets("Sheet1")
'Open a connection to SQL Server
conn.Open "Provider=SQLOLEDB;" & _
"Data Source=server1;" & _
"Initial Catalog=table1;" & _
"User ID=user1; Password=pass1"
'Skip the header row
iRowNo = 2
'Loop until empty cell in CustomerId
Do Until .Cells(iRowNo, 1) = ""
sFirstName = .Cells(iRowNo, 1)
sLastName = .Cells(iRowNo, 2)
'Generate and execute sql statement
' to import the excel rows to SQL Server table
conn.Execute "Insert into dbo.Customers (FirstName, LastName) " & _
"values ('" & sFirstName & "', '" & sLastName & "')"
iRowNo = iRowNo + 1
Loop
MsgBox "Customers imported."
conn.Close
Set conn = Nothing
End With
End Sub
这将打开与我的数据库的连接并输入指定列中的值。
主键是数据库上的增量键。问题是它将复制所有值。
我想将新的数据行添加到 Excel 工作表中,并且只插入那些尚不存在的行。
我尝试了不同的方法(“合并”、“如果存在”、“如果不存在”等),但我无法做到正确。
解决方案必须通过VBA。使用 SSMS 设置链接不是一个选项。
我知道可以使用临时表,然后触发执行合并的过程,但我想将其作为最后的手段。还没有读过它(通过我的 MS SQL 圣经书),但我希望没有必要。
---@Kannan 的回答更新---
VBA 的新部分 -
conn.Execute "IF EXISTS (SELECT 1 FROM dbo.Customers WHERE FirstName = '" & sFirstName & "' and LastName = '" & sLastName & "') " & _
"THEN UPDATE dbo.customers SET WHERE Firstname = '" & sFirstName & "' and LastName = '" & sLastName & "' " & _
"ELSE INSERT INTO dbo.Customers (FirstName, LastName) " & _
"VALUES ('" & sFirstName & "', '" & sLastName & "')"
这会返回错误“关键字“THEN”附近的语法不正确。
最佳答案
您的 SQL 查询不太正确 - SQL IF
中没有 THEN
。
此外,如果它存在,您不需要执行任何操作,因此只需使用如果不存在即可。
"IF NOT EXISTS (SELECT 1 FROM dbo.Customers WHERE FirstName = '" & sFirstName & "' and LastName = '" & sLastName & "') " & _
"INSERT INTO dbo.Customers (FirstName, LastName) " & _
"VALUES ('" & sFirstName & "', '" & sLastName & "')"
关于sql-server - 使用 VBA 仅将新记录插入到 SQL 表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39293669/