2016-09-02 2 views
1

У меня есть книги 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 и вставить только те строки, которые еще не существуют.

Я пробовал разные методы ('merge', 'if exist', if not exist 'и т. Д.), Но я не могу понять это правильно.

Решение должно быть через 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'.

ответ

4

Ваш SQL запрос не совсем верно - нет THEN в SQL IF.

Кроме того, вам не нужно ничего делать, если он существует, поэтому просто используйте, если он не существует.

"IF NOT EXISTS (SELECT 1 FROM dbo.Customers WHERE FirstName = '" & sFirstName & "' and LastName = '" & sLastName & "') " & _ 
     "INSERT INTO dbo.Customers (FirstName, LastName) " & _ 
     "VALUES ('" & sFirstName & "', '" & sLastName & "')" 
+0

Это место на. Спасибо, BeanFrog. Я действительно пытался, ЕСЛИ НЕ СУЩЕСТВУЕТ раньше, но я, очевидно, не понял. Я определенно не использовал часть «Выбрать 1». Не могли бы вы рассказать мне, как работает SELECT 1? – Jamsandwich

+0

Это просто регулярный оператор select, но вместо любых столбцов вы выбираете номер 1.Все это делается для предотвращения накладных расходов на получение всех подробностей столбца, когда все, что вам нужно знать, это «эта строка существует», а не «что находится в этой строке». – BeanFrog

+0

Удивительный. Еще раз спасибо. Это будет хорошо настроить меня, как только вы окончательно начнете работать над SQL. – Jamsandwich

0

Вы можете использовать SQL запрос, как это:

IF Exists (Select 1 from dbo.customers where Firstname = '" & sFirstName & "' and LastName = '" & sLastName & "' THEN Update dbo.customers set --other columns where Firstname = '" & sFirstName & "' and LastName = '" & sLastName & "' 
ELSE Insert into dbo.Customers (FirstName, LastName) " & _ 
        "values ('" & sFirstName & "', '" & sLastName & "')" 

Не уверен, что синтаксис для первенствовать и C#, вы можете исправить это похоже на этот запрос

+0

привет @Kannan, я добавил это в мой код и обновил свой вопрос. Вы знаете, почему я могу получить ошибку, о которой я упоминал. Похоже, вы пропустили закрывающий кронштейн в своей первой строке. Думаю, я добавил его в нужное место. – Jamsandwich

+0

Кроме того, я не был уверен, как ввести команду set. Я предполагаю, что «- другие столбцы» - это комментарий? Поэтому я понял это. – Jamsandwich

1

Это должно сделать это за вас.

Sub Button_Click() 
'TRUSTED CONNECTION 
    On Error GoTo errH 

    Dim con As New ADODB.Connection 
    Dim rs As New ADODB.Recordset 
    Dim strPath As String 
    Dim intImportRow As Integer 
    Dim strFirstName, strLastName As String 

    Dim server, username, password, table, database As String 


    With Sheets("Sheet1") 

      server = .TextBox1.Text 
      table = .TextBox4.Text 
      database = .TextBox5.Text 


      If con.State <> 1 Then 

       con.Open "Provider=SQLOLEDB;Data Source=" & server & ";Initial Catalog=" & database & ";Integrated Security=SSPI;" 
       'con.Open 

      End If 
      'this is the TRUSTED connection string 

      Set rs.ActiveConnection = con 

      'delete all records first if checkbox checked 
      If .CheckBox1 Then 
       con.Execute "delete from tbl_demo" 
      End If 

      'set first row with records to import 
      'you could also just loop thru a range if you want. 
      intImportRow = 10 

      Do Until .Cells(intImportRow, 1) = "" 
       strFirstName = .Cells(intImportRow, 1) 
       strLastName = .Cells(intImportRow, 2) 

       'insert row into database 
       con.Execute "insert into tbl_demo (firstname, lastname) values ('" & strFirstName & "', '" & strLastName & "')" 

       intImportRow = intImportRow + 1 
      Loop 

      MsgBox "Done importing", vbInformation 

      con.Close 
      Set con = Nothing 

    End With 

Exit Sub 

errH: 
    MsgBox Err.Description 
End Sub 

Добавить ссылку на: Microsoft ActiveX Data Objects 2.8 Библиотека

FYI, мой лист выглядит следующим образом.

enter image description here

Смежные вопросы