thembale Ответов: 1

Как написать SQL-скрипт, чтобы проверить, если столбец существует в таблицу, если не существует, создать столбец


Я работаю над базой данных ГИС с количеством таблиц, которые похожи проблемы в этих таблицах они не имеют такого же количества столбцов, Например, другая таблица А имеет 5 таблица Б имеет 3.
я хочу сделать так, чтобы все таблицы имели одинаковое количество столбцов, например, если таблица А имеет 5 столбцов, а таблица В должна иметь 5 столбцов, а не 3, потому что все эти таблицы имеют одинаковые данные.
Я хочу добиться этого написав sql скрипт который будет создавать все столбцы которых нет в таблице если столбцы уже есть то он должен игнорировать их и добавлять другие столбцы

Что я уже пробовал:

Below is the script that I tried the challenge with this one I have to insert one column at time, what I want is to insert multiple columns that are not included in the table once.

USE GIS_DOD_Working
Go
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = '[dbo].[LO17_BUILDINGS_F000]' AND COLUMN_NAME = 'CAT')
BEGIN

    ALTER TABLE [dbo].[LO17_BUILDINGS_F000] ADD 
       [CAT]  nvarchar (254) NULL 

    

END

CHill60

Похоже, что ваша база данных плохо спроектирована. Несколько таблиц с одинаковыми столбцами кричат мне: "сделай нормализацию!"

thembale

да, дизайн оставляет желать лучшего, что то, что я пытаюсь решить сейчас

1 Ответов

Рейтинг:
4

Richard Deeming

Как уже упоминалось в комментариях, это чрезвычайно плохой дизайн базы данных.

Но если вы просто хотите сгенерировать список скриптов для добавления недостающих столбцов в таблицы, то что-то вроде этого должно сработать:

WITH cteTables (Name) As
(
    -- List of the tables to modify:
              SELECT N'[dbo].[Table1]'
    UNION ALL SELECT N'[dbo].[Table2]'
    UNION ALL SELECT N'[dbo].[Table3]'
),
cteColumns (Name, Definition) As
(
    -- List of the columns to create:
              SELECT N'Column1', N'nvarchar(254) NULL'
    UNION ALL SELECT N'Column2', N'nvarchar(254) NULL'
),
cteToCreate As
(
    SELECT
        T.Name As TableName,
        C.Name As ColumnName,
        C.Definition
    FROM
        cteTables As T
        CROSS JOIN cteColumns As C
    WHERE
        Not Exists
        (
            SELECT 1
            FROM sys.columns As E
            WHERE E.object_id = OBJECT_ID(T.Name)
            And E.name = C.Name
        )
)
SELECT
    N'ALTER TABLE ' + T.TableName + N' ADD '
    + STUFF(
        (
            SELECT N', ' + QUOTENAME(C.ColumnName) + N' ' + C.Definition 
            FROM cteToCreate As C 
            WHERE C.TableName = T.TableName 
            ORDER BY C.ColumnName 
            FOR XML PATH(''), TYPE
        ).value('.', 'varchar(max)'), 
        1, 2, N'')
    + N';'
FROM
    cteToCreate As T
GROUP BY
    TableName
;

Если вы выполните это, вы получите список команд, которые необходимо выполнить, чтобы создать недостающие столбцы. Например:
ALTER TABLE [dbo].[Table1] ADD [Column2] nvarchar(254) NULL;
ALTER TABLE [dbo].[Table3] ADD [Column1] nvarchar(254) NULL, [Column2] nvarchar(254) NULL;


thembale

Спасибо Вам за отличное решение.