Создайте инструкцию UPDATE для каждой строки в таблице - PullRequest
0 голосов
/ 25 июня 2019

Я хочу обновить таблицу на одном сервере данными из таблицы на другом сервере. Таблицы имеют одинаковые столбцы, и я просто хочу синхронизировать данные. Ранее я создал скрипт, который создает операторы вставки для этих таблиц (поставил вопрос к 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'

1 Ответ

0 голосов
/ 25 июня 2019

Это, кажется, отвечает всем требованиям.Кавычки в данных теперь корректно удваиваются, и конечным результатом является один оператор UPDATE для каждой строки в таблице, как я хотел.Как я уже упоминал, чтение из information_schema.columns не требуется, когда я просто работаю с одним известным столбцом, но, возможно, когда я модифицирую этот скрипт для другой таблицы, это не так ...

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('+QUOTENAME(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 ' '+ QUOTENAME(COLUMN_NAME) +'='''''' + ', 'ISNULL(REPLACE('+QUOTENAME(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 ' + ''' Update_Script ' + 'FROM ' + @TABLE_NAME

-- SELECT @SQL_KOD

EXECUTE (@SQL_KOD)

SET NOCOUNT OFF

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