Обновление столбца в каждой таблице в схеме в SQL Server - PullRequest
0 голосов
/ 05 ноября 2019

Я хочу обновить столбец Last_Modified в каждой таблице в данной схеме. Этот столбец обновляется с использованием последней отметки времени, если обновляется другой столбец в той же таблице (ENDTIME).

Для этого у меня есть следующий скрипт в SQL Server:

DECLARE @TotalRows FLOAT
SET @TotalRows = (SELECT COUNT(*) FROM table1)

DECLARE @TotalLoopCount INT
SET @TotalLoopCount = CEILING(@TotalRows / 100000)

DECLARE @InitialLoopCount INT
SET @InitialLoopCount = 1

DECLARE @AffectedRows INT
SET @AffectedRows = 0

DECLARE @intialrows INT;
SET @intialrows = 1

DECLARE @lastrows INT
SET @lastrows = 100000;

WHILE @InitialLoopCount <= @TotalLoopCount
BEGIN
    WITH updateRows AS
    (
        SELECT 
            t1.*, 
            ROW_NUMBER() OVER (ORDER BY caster) AS seqnum 
        FROM
            table1 t1
    )
    UPDATE updateRows 
    SET last_modified = ENDTIME AT TIME ZONE 'Central Standard Time'
    WHERE last_modified IS NULL 
      AND updateRows.ENDTIME IS NOT NULL
      AND updateRows.seqnum BETWEEN @intialrows AND @lastrows; 

    SET @AffectedRows = @AffectedRows + @@ROWCOUNT
    SET @intialrows = @intialrows + 100000
    SET @lastrows = @lastrows + 100000

    -- COMMIT
    SET @Remaining = @TotalRows - @AffectedRows
    SET @InitialLoopCount = @InitialLoopCount + 1
END

ЭтоСценарий определяет количество таблиц, делит их на 100000 и выполняет только столько циклов, чтобы выполнить все обновление. Он разбивает обновление на пакеты / циклы, а затем выполняет обновления для определенных строк, пока не завершит их обновление.

Этот сценарий предназначен только для 1 таблицы, т. Е. Table1. Теперь я хочу изменить этот скрипт таким образом, чтобы он динамически принимал все таблицы в схеме и запускал вышеуказанный скрипт для каждой из них. Допустим, имя схемы - schema1, и в ней 32 таблицы, поэтому этот сценарий должен выполняться для всех этих 32 таблиц.

Я не могу получить таблицы в schema1, но не могу динамически отправить их в эту таблицу. скрипт. Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 05 ноября 2019

Для динамического изменения имен таблиц во время выполнения вам понадобится что-то вроде sp_executesql. Смотрите здесь пример его использования: https://stackoverflow.com/a/3556554/22194

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

Если ваша схема не сильно изменится, другим подходом будет создание длинного сценария с разделом для каждой таблицы. Вы генерируете сценарий, запрашивая имена таблиц и затем повторяя сценарий с каждым другим именем таблицы. Excel на самом деле очень хорош для такого рода действий - вставьте имена таблиц в Excel, используйте Excel для создания сценария, а затем скопируйте / вставьте его обратно в SSMS.

Это будет длинный повторяющийся сценарий, но он будет избегатьнедостаток наличия всего SQL в строках.

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