Поиск полей таблицы
Вот как вы можете выбрать имена столбцов таблицы:
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_A' AND TABLE_SCHEMA='YourSchemaName';
Это хорошо, но вы также хотите l oop сверх имена столбцов.
Создание курсора для ваших результатов
DECLARE column_cursor CURSOR FOR select_statement
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_A' AND TABLE_SCHEMA='YourSchemaName';
Откройте курсор
OPEN column_cursor;
L oop ваш курсор
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM column_cursor INTO
@column_name;
END;
Обратите внимание, что column_name
- это переменная, которую нужно объявить ранее.
Создайте условие where
На каждом шаге вашего l oop в курсоре вам нужно будет добавить некоторые новые критерии. Ваш окончательный критерий будет выглядеть так:
c1 равен нулю или c2 равен нулю или ... или cn равен нулю
Итак, вам нужно инициализировать переменную @where
обнулить и иметь этот логику c в вашем курсоре l oop:
IF ISNULL(@where)
BEGIN
@where = CONCAT(' ', @column_name, ' IS NULL ');
END
ELSE
BEGIN
@where = CONCAT(@where, ' OR ', @column_name, ' IS NULL ');
END
Постройте ваше обновление
Теперь у вас есть хорошее выражение where, но давайте сгенерируем предложение set из а также ваше обновление, давайте предположим, что у вас есть переменная @set, инициализированная нулем. Это то, что вам нужно внутри l oop:
IF ISNULL(@set)
BEGIN
@set = CONCAT(' ', @column_name, ' = CASE WHEN source.', @column_name, ' IS NULL THEN NULL ELSE target.', @column_name, ' END ');
END
ELSE
BEGIN
@set = CONCAT(@set, ', ', @column_name, ' = CASE WHEN source.', @column_name, ' IS NULL THEN NULL ELSE target.', @column_name, ' END ');
END
Давайте создадим запрос на обновление
@query = CONCAT('UPDATE target SET ', @set, ' FROM ', @source_table, ' source JOIN ', @target_table, ' target ON source.id = target.id WHERE ', @where, ';');
Выполнить строку как запрос
EXEC (@query);