У меня есть хранимая процедура, которая выполняет массовую вставку большого количества записей журнала DNS. Я хочу sh суммировать эти необработанные данные в новой таблице для анализа. Новая таблица принимает заданную запись журнала для полного доменного имени и типа записи и содержит только одну запись с числом совпадений.
Исходная таблица может включать 100 строк:
FQDN, Type
www.microsoft.com,A
Таблица назначения будет иметь:
FQDN, Type, HitCount
www.microsoft.com, A, 100
SP устанавливает уникальный идентификатор, состоящий из [FQDN] + '|' + [Type], который затем используется в качестве первичного ключа в целевой таблице.
My План состоял в том, чтобы SP запускал триггер, который выполнял UPDATE ... IF @@ ROWCOUNT = 0 ... INSERT. Однако это, конечно же, не удалось, потому что триггер получает все [вставленные] строки как один набор, поэтому всегда выдает ошибку нарушения ключа.
У меня проблемы с поиском решения, и мне нужно немного fre sh глаза и лучшие навыки взглянуть. Пакетная вставка SP работает нормально, а исходные данные соответствуют желанию. Однако попытка найти подходящий метод для создания сводных данных выходит за рамки моих нынешних навыков / мышления.
У меня есть несколько десятков ТБ данных для обработки, поэтому я не рассматриваю сводку как нечто мы могли бы делать это динамически с помощью SELECT COUNT - вот почему я начал с маршрута триггера.
Соответствующий код в SP управляется курсором, состоящим из списка сжатых файлов журнала, которые необходимо распаковать и -вставлен и выглядит следующим образом:
-- Bulk insert to a view because bulk insert cannot populate the UID field
SET @strDynamicSQL = 'BULK INSERT [DNS_Raw_Logs].[dbo].[vwtblRawQueryLogData] FROM ''' + @strTarFolder + '\' + @strLogFileName + ''' WITH (FIRSTROW = 1, FIELDTERMINATOR = '' '', ROWTERMINATOR = ''0x0a'', ERRORFILE = ''' + @strTarFolder + '\' + @strErrorFile + ''', TABLOCK)'
--PRINT @strDynamicSQL
EXEC (@strDynamicSQL)
-- Update [UID] field after the bulk insert
UPDATE [DNS_Raw_Logs].[dbo].[tblRawQueryLogData]
SET [UID] = [FQDN] + '|' + [Type]
FROM [tblRawQueryLogData]
WHERE [UID] IS NULL
Я знаю, что решение UPDATE ... IF @@ ROWCOUNT = 0 ... INSERT неверно, поскольку оно предполагает, что входные данные представляют собой одну строку. Буду признателен за помощь в этом. Спасибо