Я хочу обновить таблицу на одном сервере данными из таблицы на другом сервере. Таблицы имеют одинаковые столбцы, и я просто хочу синхронизировать данные. Ранее я создал скрипт, который создает операторы вставки для этих таблиц (поставил вопрос к SO и сам ответил на него ...), но, казалось бы, более простая задача создания операторов UPDATE
теперь ускользает от меня. Может быть, потому что я только что вернулся из отпуска.
Для справки, вот мой «вопрос ВСТАВКИ»: Создание «Не существует» / Вставка в операторы - ничего не стоит (NULL)
Я пытаюсь использовать мой код INSERT
операторов, но я либо не получаю несколько строк, либо просто получаю сообщения об ошибках, которые трудно отладить (Ошибка близка к NULL)
Итак, я хочу создать такие операторы, по одному для каждой строки в таблице:
UPDATE WorkflowError
SET [ErrorDescription] = 'Error creating email'
WHERE [TargetSystem]='Fullmaktsnoden'
AND [ErrorCode]='999'
AND [ErrorText]='Error creating email'
AND [ErrorDescription] IS NULL
Я мог бы использовать некоторые общие указатели, такие как "Since you're now creating UPDATE statements instead of INSERT you need to think about..."
Это таблица, используемая для интеграции нескольких систем. Мы «собираем» сообщения, полученные от других систем, и записываем их в ErrorDescription. Если оно слишком длинное или вводит в заблуждение, мы добавляем более короткое объяснение в текст ошибки, чтобы показать его пользователю. (в этом примере я использовал один и тот же текст «ошибка при создании электронной почты», но в реальной системе описание ошибки, которое мы получаем, гораздо длиннее)
Одна попытка - это такой код:
USE FullmaktsnodenProcess
GO
SET NOCOUNT ON
DECLARE @QUOTED_DATA VARCHAR(MAX),
@DOES_EXIST VARCHAR(MAX),
@SQL_KOD VARCHAR(MAX),
@TABLE_NAME VARCHAR(MAX),
@FIRST_COL INT,
@LAST_COL INT,
@THE_COLUMN VARCHAR(MAX)
/* INPUT DATA */
SELECT @TABLE_NAME = 'WorkflowError'
SELECT @FIRST_COL = 2 -- First column for Exists check
SELECT @LAST_COL = 4 -- Last column for Exists check
SELECT @THE_COLUMN = 'ErrorDescription'
/* */
SELECT @QUOTED_DATA=STUFF
(
(
SELECT ' ISNULL('''''''' + REPLACE('+COLUMN_NAME+','''''''','''''''''''') + '''''''','''+'NULL'''+''+')+'',''+'
FROM information_schema.columns
WHERE table_name = @TABLE_NAME AND
COLUMN_NAME = @THE_COLUMN
FOR XML PATH('')
),1,1,''
)
SELECT @QUOTED_DATA=SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)
SELECT @QUOTED_DATA
SELECT @DOES_EXIST=STUFF
(
(
SELECT ' ['+ COLUMN_NAME +']='' + ', 'ISNULL('''''''' + REPLACE('+COLUMN_NAME+','''''''','''''''''''') + '''''''','''+'NULL'''+''+')+'' AND '
FROM information_schema.columns
WHERE table_name = @TABLE_NAME AND
ordinal_position BETWEEN @FIRST_COL AND @LAST_COL
FOR XML PATH('')
),1,1,''
)
SELECT @DOES_EXIST
SELECT @SQL_KOD='SELECT ''UPDATE ' + @TABLE_NAME + ' SET ' + QUOTENAME(@THE_COLUMN) + ' = ' + @QUOTED_DATA + ' WHERE ' + @DOES_EXIST + @THE_COLUMN + ' IS NULL'''
SELECT @SQL_KOD
EXECUTE (@SQL_KOD)
SET NOCOUNT OFF
GO
Попытка выполнить @SQL_KOD дает: «Сообщение 156, Уровень 15, Состояние 1, Строка 3 Неверный синтаксис рядом с ключевым словом« NULL ».»
Начиная с тестового запуска, с EXECUTE (@SQL_KOD) закомментировано:
@QUOTED_DATA = ISNULL('''' + REPLACE(ErrorDescription,'''','''''') + '''','NULL')
@DOES_EXIST = [TargetSystem]=' + ISNULL('''' + REPLACE(TargetSystem,'''','''''') + '''','NULL')+' AND [ErrorCode]=' + ISNULL('''' + REPLACE(ErrorCode,'''','''''') + '''','NULL')+' AND [ErrorText]=' + ISNULL('''' + REPLACE(ErrorText,'''','''''') + '''','NULL')+' AND
@SQL_KOD = SELECT 'UPDATE WorkflowError SET [ErrorDescription] = ISNULL('''' + REPLACE(ErrorDescription,'''','''''') + '''','NULL') WHERE [TargetSystem]=' + ISNULL('''' + REPLACE(TargetSystem,'''','''''') + '''','NULL')+' AND [ErrorCode]=' + ISNULL('''' + REPLACE(ErrorCode,'''','''''') + '''','NULL')+' AND [ErrorText]=' + ISNULL('''' + REPLACE(ErrorText,'''','''''') + '''','NULL')+' AND ErrorDescription IS NULL'