Как добавить несколько столбцов из другой таблицы в SQL Server 2017? - PullRequest
0 голосов
/ 09 мая 2019

У меня есть требование, когда мне нужно добавить несколько столбцов из исходной таблицы после проверки существования этих столбцов.например:

Таблица 1, содержащая 7 кулонов, таких как A, B, C, D, E, F, G и Таблица 2, содержащая 4 столбца, таких как A, B, C, D

Я хочу проверитьналичие столбцов таблицы Table1 в таблице 2 и, если их нет, добавьте остальные 3 столбца в таблицу 2.Я ищу решение, в котором мне не нужно добавлять эти столбцы вручную, если их нет в таблице 2.

Как я могу это сделать?

Я пробовал это:

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;

Но это не решение моего запроса, я хочу сделать его динамическим и не знаю, как это сделать.

1 Ответ

0 голосов
/ 09 мая 2019

Я ни на секунду не думаю, что это хорошая идея, но это позволит достичь того, что вы ищете.Обратите внимание, что если один и тот же столбец существует по имени в обеих таблицах, но имеет разные типы данных, этот столбец будет игнорироваться:

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