我有一個Excel工作簿與下面的代碼 -插入新記錄只到SQL表使用VBA
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聖經書的方式),但我希望它不是必要的。
---從@卡納安的回答更新---
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 & "')"
這將返回錯誤「不正確的語法關鍵字接近 '那麼'。
這就是現貨。 Thankyou BeanFrog。我之前曾試過IF NOT EXISTS,但我顯然沒有把它做對。我當然沒有使用'選擇1'部分。你能告訴我SELECT 1是如何工作的嗎? – Jamsandwich
這只是一個常規選擇語句,但不是任何列,而是選擇數字1。所有這一切都是爲了防止獲取所有列詳細信息的開銷,當您需要知道的只是'此行是否存在'而不是'此行中的內容'。 – BeanFrog
太棒了。再次感謝。一旦最終開始專門研究SQL,這將很好地幫助我。 – Jamsandwich