【问题标题】:Copy null values from one table to another in SQL Server在 SQL Server 中将空值从一个表复制到另一个表
【发布时间】:2020-03-24 09:46:04
【问题描述】:

如何从 table_A 的各个列中找到所有空值,然后将这些空值复制或插入到另一个 table_B 的各个列中,该 table_B 具有与 table_A 一样的精确架构(即所有列)。

有什么方法可以动态地或不指定表的任何列名。也欢迎其他方法。

我尝试了以下方法来查找具有null 值的列:

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

【问题讨论】:

  • 我不明白。如果一行具有这些值:col1 = NULL、col2 = NULL、col3 = 333。您希望将空值复制到另一个表。另一个表具有相同的列,因此您使用 col1 = NULL、col2 = NULL 创建一行。对于col3?您想在该行中插入哪个值?也为空?然后你只插入空行。请详细说明。
  • table_Atable_B 是否包含完全相同的行(意味着相同的主键 ID),或者 ID 和/或行数是否存在差异?请edit问题使其更完整。
  • 给出一个具体的例子来说明你想要做什么,两个表的实际示例数据以及使用这两个示例表时应该得到的结果。 stackoverflow.com/help/minimal-reproducible-example
  • 如果您想动态地执行此操作,而无需指定列名,您需要编写 SQL 的代码(这就是 Dynamic-SQL)。 SQL-writing-code 读取数据库的模式并编写一个或多个 sql 语句来执行您想要的操作,但是 that SQL 语句中包含列名(SQL 无法执行 anything 没有列名)。所以,先弄清楚如何使用列名,然后找出动态生成该 SQL 所需的代码。

标签: sql sql-server tsql dynamic-sql


【解决方案1】:

查找表的字段

这是您可以选择表的列名的方法:

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_A' AND TABLE_SCHEMA='YourSchemaName';

这很好,但您还想遍历列名。

为结果创建光标

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;

循环光标

WHILE @@FETCH_STATUS = 0
    BEGIN
        FETCH NEXT FROM column_cursor INTO 
            @column_name;
    END;

请注意,column_name 是您需要提前声明的变量。

构建你的 where 子句

在光标上循环的每一步,您都需要添加一些新条件。您的最终标准将类似于

c1 为 null 或 c2 为 null 或 ... 或 cn 为 null

因此,您需要将 @where 变量初始化为 null 并在光标循环中包含此逻辑:

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 变量初始化为 null。这是你在循环中需要的:

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2010-10-13
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多