Скопируйте нулевые значения из одной таблицы в другую на сервере SQL - PullRequest
0 голосов
/ 24 марта 2020

Как найти все нулевые значения из соответствующих столбцов таблицы _A, а затем скопировать или вставить эти нулевые значения в соответствующие столбцы другой таблицы _B, которая имеет точную схему (т. Е. Все столбцы), например, table_A.

Есть ли способ, которым мы можем сделать это динамически или без указания каких-либо имен столбцов таблицы. Также приветствуются другие подходы.

Я пробовал следующее, чтобы найти столбцы, имеющие значения null:

select * 
from table_A
where col_1 is null or col_2 is null

1 Ответ

0 голосов
/ 24 марта 2020

Поиск полей таблицы

Вот как вы можете выбрать имена столбцов таблицы:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...