Альтернатива Index + Поиск по Access / DAO с использованием SQL Server / ADO - PullRequest
0 голосов
/ 18 апреля 2019

Я преобразую приложение Excel из локальной серверной части MS Access (с DAO) в SQL Server, работающий на Azure (с ADO).

Обычная задача, которую я выполняю с помощью DAO, - это метод index + seekсканировать большое количество входных строк (~ 10 000 и с использованием многопольных индексов), проверять соответствие записей в базе данных и обновлять или добавлять новые записи по мере необходимости.Свойство NoMatch метода Seek работает очень хорошо при принятии решения о добавлении или обновлении.

Кажется, что это должно быть довольно просто с SQL Server, но я не могу найти хорошее решение, которое позволяет мне проверятьдля совпадений добавьте или обновите и используйте многостолбцовые индексы.

Загрузка таблицы в память, а затем выполнение пакетного обновления было бы хорошо, но метод Find в ADO выглядит не так хорошо, как index + seek, и этоне может использовать несколько столбцов.Подключение к SQL Server с поставщиком ADO, который поддерживает поиск по индексу, также будет работать (Jet 4.0?), Но я также не могу найти примеры этого.

Я что-то упускаю из виду?Каков наилучший способ проверить и добавить или обновить большое количество строк в SQL Server?Спасибо

Редактировать: Вот простой пример операции, которую я сейчас выполняю в Access / DAO:

    Set rs = db.OpenRecordset("TableName", dbOpenTable)
    With rs
        .Index = "MultiFieldIndex"

        'Loop through the input data
        For i = 1 To 10000
            .Seek "=", Criteria1, Criteria2

            If Not .NoMatch Then
                'Found a match, just update specific fields
                !Field1 = a
                !Field2 = b

                Else
                'No match found, add a new record then populate
                .AddNew
                !Field3 = c
                !Field4 = d

            End If

            .Update
        Next i
    End With

Каков наилучший способ сделать что-то подобное только с SQL?Вероятно, я бы все-таки начал с загрузки отключенного набора записей полной целевой таблицы, но не уверен, как обновить несколько тысяч записей, когда не знаю, нужно ли мне обновлять или добавлять новые, или значения входных данных.критерии.Как найти строки, которые мне нужно обновить / проверить без индекса + поиска?

ИЛИ я могу создать временную таблицу в памяти только с входными данными, а затем как-то просто «объединить» эту таблицу с базой данных иБД выяснит, как обновить или добавить?

Мне кажется, это должна быть довольно простая процедура, но, может быть, я просто упускаю фундаментальную концепцию SQL?

Спасибо за помощь!

1 Ответ

0 голосов
/ 24 апреля 2019

Решением было бы написать SQL-запрос create procedure dbo.prc_TableNameUpdIns (@parm1 int, @parm2 int) AS IF EXISTS (SELECT * from MyTable WHERE A = @parm1 AND B = @parm2) UPDATE ... ELSE INSERT....

GO

(вы могли бы использовать слияние, но я советую против этого)

И вы вызываете SP с помощьюсоздание AdoConnection (в VBA) dim myAdoConnection as ADOConnection

dim X as Integer, Y as Integer X = 7 Y = 8

'SET the myAdoConnection 'Calling the proc myAdoConnection.prc_TableNameUpdIns X, Y

Обработка как можно большего количества кода в SQL является гораздо более предпочтительной.Единственный раз, когда вам нужно выполнить этот тип манипуляции ADO, это когда вам нужно обновить форму только и не обязательно саму базу данных.

О ADO-соединение И еще немного изучить предмет, это всего лишь указатель

...