У меня есть 4 столбца, которые повторяются во всех таблицах в базе данных, и я должен удалить их

enter image description here

Как я могу сделать это удаление без необходимости въезда в таблицу?

-2
Esteban Giraldo 3 Июн 2021 в 21:57

2 ответа

Лучший ответ

SQL Server предоставляет Схема информационной схемы системы, которые могут быть запрошены для получения информации о базе данных.

В вашем случае COLUMNS Просмотр можно использовать для получения имен всех таблиц, содержащих определенное имя столбца.

SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN (
    'ID_Integracion_CodBodega',
    'ID_Integracion_FechaUltRep',
    'ID_Integracion_ControlTrigger',
    'ID_Integracion_CodBodega_Origen'
);

Оттуда вы можете использовать нормальный процесс для Удалить столбец из существующей таблицы.

ALTER TABLE [table_name] DROP COLUMN [column_name];

Вы должны быть очень осторожно с этим подходом. Легко отбросить колонку, на которую вы не имели в виду.

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

  • Есть ли Ограничения на ваших таблицах, которые будут затронуты удалением этих столбцов? (Особенно ON DELETE CASCADE ограничения, которые могут повлиять на другие таблицы).
  • Есть ли представления / хранимые процедуры / триггеры, которые зависят от этих столбцов?
  • У вас есть запросы / динамические SQL, которые будут пострадали от удаления этих столбцов?
1
D M 3 Июн 2021 в 19:17

Этот код выводит необходимый SQL, чтобы внести изменения.

STRING_AGG используется дважды для группировки колонн и таблиц. QUOTENAME используется для правильного размещения кронштейнов вокруг имен.

SELECT STRING_AGG(
N'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + N'.' + QUOTENAME(t.object_id) + N'
    ' + c.ColumnSql, N'
')
FROM sys.tables t
CROSS APPLY (
    SELECT ColumnSql = STRING_AGG(CAST(N'DROP COLUMN ' + QUOTENAME(c.name) AS nvarchar(max), N'
    ')
    FROM sys.columns c
    WHERE c.object_id = t.object_id
      AND c.name IN (
        'ID_Integracion_CodBodega',
        'ID_Integracion_FechaUltRep',
        'ID_Integracion_ControlTrigger',
        'ID_Integracion_CodBodega_Origen'
    )
) c

Вы можете выполнить все вместе, используя

DECLARE @sql nvarchar(max) = (
    SELECT STRING_AGG.....
);

EXEC(@sql);

Я предостерегаю вас против использования INFORMATION_SCHEMA, потому что это только для совместимости.

2
Charlieface 3 Июн 2021 в 23:29