【问题标题】:How to add multiple columns from another table in sql server 2017?如何在 sql server 2017 中从另一个表中添加多个列?
【发布时间】:2019-05-09 11:29:00
【问题描述】:

我有一个要求,我需要在检查这些列是否存在后从源表中添加多个列。例如:

Table1 包含 7 列,如 A、B、C、D、E、F、G 和 Table2 包含 4 列,如 A、B、C、D

我想检查 Table2 中 table1 列的存在性,如果不存在,则在 Table2 中添加其余 3 列。我正在寻找一种解决方案,如果 table2 中不存在这些列,我不需要手动添加这些列。

我该怎么做?

我试过这个:

if exists (SELECT TABLE_NAME, COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='table1' and COLUMN_NAME in('A','B','C','D','E','F','G'))
BEGIN
  ALTER TABLE table2
    ADD [E] FLOAT null
,[F] FLOAT null
,[G] FLOAT null
END;

但这不是我的查询的解决方案我想让它动态并且不知道如何做到这一点。

【问题讨论】:

  • 您必须使用动态 SQL。到目前为止,您尝试过什么?
  • 从系统表中您将能够获得两个表的列列表。然后比较并在 table2 中插入缺失的列。正如@Larnu 所说,您需要为此执行动态 SQL。
  • 动态添加列似乎是一个非常糟糕的主意。我怀疑您的处理过程中还有其他问题。
  • stackoverflow.com/questions/23356923/… 这是你需要的实现

标签: sql sql-server


【解决方案1】:

我不认为这是一个好主意,但这会实现你所追求的。请注意,如果两个表中按名称存在相同的列,但具有不同的数据类型,则该列将被忽略:

CREATE TABLE Table1 (a int,
                     b numeric(12,2),
                     c datetime2(0),
                     d date,
                     e varchar(20),
                     f sysname,
                     g varbinary);

CREATE TABLE Table2 (a int,
                     b numeric(12,2),
                     c datetime2(0),
                     d date);

GO
DECLARE @SQL nvarchar(MAX);

SET @SQL = STUFF((SELECT NCHAR(13) + NCHAR(10) + 
                         N'ALTER TABLE Table2 ADD ' + QUOTENAME(T1.name) + N' ' + T1.system_type_name + N';'
                  FROM sys.dm_exec_describe_first_result_set(N'SELECT * FROM Table1',NULL, NULL) T1
                  WHERE NOT EXISTS(SELECT 1
                                   FROM sys.dm_exec_describe_first_result_set(N'SELECT * FROM Table2',NULL, NULL) T2
                                   WHERE T1.[name] = T2.[name])
                  ORDER BY T1.column_ordinal
                  FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,2,N'');
PRINT @SQL;

EXEC sp_executesql @SQL;
GO

SELECT *
FROM dbo.Table2;

GO

DROP TABLE dbo.Table2;
DROP TABLE dbo.Table1;

【讨论】:

    猜你喜欢
    • 2022-07-18
    • 2022-10-23
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2019-03-13
    • 2021-01-11
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多