Создание представлений с пропущенным столбцом для всех таблиц в базе данных - PullRequest
0 голосов
/ 28 февраля 2020

В моей базе данных имеется большое количество таблиц, давайте назовем их Table1, Table2, Table3 и т. Д., Которые мне нужно настроить для репликации слиянием, что означает, что SQL Сервер создаст новый столбец (rowguid) в каждой таблице.

Это проблематично c для моего внешнего интерфейса (который я не могу изменить), поэтому моя идея сейчас состоит в том, чтобы создать представление каждой таблицы с удаленным столбцом rowguid и поместить их в собственную схему .

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

Мне нужен рекурсивный код, который создает новое представление для каждой таблицы (имя которой совпадает с именем таблицы, но в новой схеме), но в каждой таблице отсутствует столбец rowguid. .

Я узнал, как я могу отбросить столбец rowguid без необходимости явно знать имена столбцов (они варьируются от таблицы к таблице).

SELECT * INTO #TemporaryTable FROM [dbo].[Table1]
ALTER TABLE #TemporaryTable DROP COLUMN rowguid
SELECT * FROM #TemporaryTable

DROP TABLE #TemporaryTable

Но как это объединить с CREATE VIEW (может иметь только один SELECT, как я понимаю), а затем также передать его в go через все таблицы в моей базе данных, что выходит за рамки моей компетенции.

1 Ответ

0 голосов
/ 28 февраля 2020

Один из способов сделать это - использовать Dynami c SQL. CREATE VIEW должен, однако, быть единственным оператором в пакете, что означает, что если вы хотите создать по одному для каждой таблицы, то вам нужно либо использовать Dynami c Dynami c SQL (да, я сказал, что ) или используйте CURSOR. Предыдущий будет более производительным для большого количества таблиц, но последние легче читать (и писать). Если это однократный процесс, то меня меньше беспокоит производительность, поэтому я go по маршруту CURSOR.

CREATE SCHEMA vw; --Create a schema for the views
GO

DECLARE Tables CURSOR FORWARD_ONLY
FOR
SELECT s.[name] AS SchemaName,
       t.[name] AS TableName
FROM sys.schemas s
     JOIN sys.tables t ON s.schema_id = t.schema_id
WHERE EXISTS (SELECT 1
              FROM sys.columns c
              WHERE c.object_id = t.object_id
                AND c.[name] = N'rowguid'); --Incase you have tables without this, as I assume you don't need views of those

DECLARE @SchemaName sysname,
        @TableName sysname,
        @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

OPEN Tables;

FETCH NEXT FROM Tables
INTO @SchemaName, @TableName;

WHILE @@FETCH_STATUS = 0
BEGIN

    PRINT N'Creating View for object ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + N'.';

    --Create the dynamic statement
    SET @SQL = N'CREATE VIEW vw.' + QUOTENAME(@TableName) + N' AS' + @CRLF + @CRLF +
               N'    SELECT ' + STUFF((SELECT N',' + @CRLF +
                                              N'           ' + QUOTENAME(C.[name])
                                       FROM sys.columns c
                                            JOIN sys.tables t ON c.object_id = t.object_id
                                            JOIN sys.schemas s ON t.schema_id = s.schema_id
                                       WHERE t.[name] = @TableName
                                         AND s.name = @SchemaName
                                         AND c.[name] != N'rowguid'
                                       ORDER BY c.column_id ASC
                                       FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,14,N'') + @CRLF +
              N'    FROM ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + N';'

    PRINT @SQL; --Incase you need to the code run for debugging

    --Create the View
    EXEC sp_executesql @SQL;

    --Get next object
    FETCH NEXT FROM Tables
    INTO @SchemaName, @TableName;

END;

CLOSE Tables;
DEALLOCATE Tables;

Обратите внимание, что это не удастся, если у вас есть 2 таблицы на разных схемах с одинаковыми именами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...