簡體   English   中英

在 SQL 服務器中的模式中更新每個表中的列

[英]Updating a column in every table in a schema in SQL Server

我想更新給定模式中每個表中的Last_Modified列。 如果同一表中的另一列 ( ENDTIME ) 更新,則此列將更新為最新時間戳。

為此,我在 SQL 服務器中有以下腳本:

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 中的表,但無法將它們動態發送到此腳本。 誰能幫我解決這個問題?

要在運行時動態更改表名,您將需要 sp_executesql 之類的東西。 有關其使用示例,請參見此處: https://stackoverflow.com/a/3556554/22194

然后你可以有一個外部 cursor 獲取表名,然后將查詢組合成一個字符串並執行它們。 它會看起來很可怕。

如果您的架構沒有太大變化,另一種方法是生成一個長腳本,其中每個表都有一個部分。 您可以通過查詢表名然后使用每個不同的表名重復該腳本來生成腳本。 Excel 實際上非常適合做這類事情 - 將表名粘貼到 Excel,使用 Excel 生成腳本,然后將其復制/粘貼回 SSMS。

這將是一個冗長的重復腳本,但可以避免在字符串中包含所有 SQL 的缺點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM