Экспорт новых данных только из Excel в SQL - PullRequest
1 голос
/ 02 апреля 2010

Следующий код Excel VBA экспортирует данные из электронной таблицы в SQL:

Sub SQLIM()

          ' Send data to SQL Server
     ' This code loads data from an Excel  Worksheet to an SQL Server Table
     ' Data should start in column A and should be in the same order as the server table
     ' Autonumber fields should NOT be included'
     ' FOR THIS CODE TO WORK
     ' In  VBE you need to go Tools  References and check Microsoft Active X Data  Objects 2.x library


    Dim Cn As ADODB.Connection
    Dim ServerName As String
    Dim DatabaseName As String
    Dim TableName As String
    Dim UserID As String
    Dim Password As String
    Dim rs As ADODB.Recordset
    Dim RowCounter As Long
    Dim ColCounter As Integer
    Dim NoOfFields As Integer
    Dim StartRow As Long
    Dim EndRow As Long
    Dim shtSheetToWork As Worksheet
    Set shtSheetToWork = ActiveWorkbook.Worksheets("Sheet1")
    Set rs = New ADODB.Recordset


    ServerName = "WIN764X\sqlexpress" ' Enter your server name here
    DatabaseName = "two28it" ' Enter your  database name here
    TableName = "COS" ' Enter your Table name here
    UserID = "" ' Enter your user ID here
     ' (Leave ID and Password blank if using windows Authentification")
    Password = "" ' Enter your password here
    NoOfFields = 7 ' Enter number of fields to update (eg. columns in your worksheet)
    StartRow = 2 ' Enter row in sheet to start reading  records
    EndRow = shtSheetToWork.Cells(Rows.Count, 1).End(xlUp).Row ' Enter row of last record in sheet

     '  CHANGES
   ' Dim shtSheetToWork As Worksheet
   ' Set shtSheetToWork = ActiveWorkbook.Worksheets("Sheet1")
     '********

    Set Cn = New ADODB.Connection
    Cn.Open "Driver={SQL Server};Server=" & ServerName & ";Database=" & DatabaseName & _
    ";Uid=" & UserID & ";Pwd=" & Password & ";"

    rs.Open TableName, Cn, adOpenKeyset, adLockOptimistic

    For RowCounter = StartRow To EndRow
        rs.AddNew
        For ColCounter = 1 To NoOfFields
            rs(ColCounter - 1) = shtSheetToWork.Cells(RowCounter, ColCounter)
        Next ColCounter
    Next RowCounter
    rs.UpdateBatch

     ' Tidy up
    rs.Close
    Set rs = Nothing
    Cn.Close
    Set Cn = Nothing

End Sub

Я хочу изменить код на:

  1. Проверьте, существуют ли данные из столбца A в таблице SQL.
  2. Если данные существуют, обновлять, а не импортировать как новую роль.
  3. если данные не существуют, импортируйте их как новую роль.

Ответы [ 2 ]

0 голосов
/ 24 января 2013

Я бы предложил загрузить данные из Excel в промежуточную таблицу в SQL, а затем вызвать (также через VBA) хранимую процедуру SQL, которая содержит логику, соответствующую вашим потребностям, для объединения данных из промежуточной таблицы в конечную таблицу назначения. 1001 *

0 голосов
/ 02 апреля 2010

Это неправильный способ выполнить эту задачу. Сделайте это с сервера SQL вместо этого. Посмотрите команду слияния, если вы используете SQL Server 2008.

Также рассмотрите возможность использования SSIS для выполнения этой задачи, это лучший выбор, чем делать это из VBA. ИЛИ найдите команду OPenrowset в t-SQL и сделайте это таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...