使用mssql更新架构中每个表中的列

问题描述 投票:0回答:1

我想更新模式中每个表中的Last_Modified列。如果同一表中的另一列(ENDTIME)已更新,则此列将使用最新时间戳进行更新。

为此,我在mssql中具有以下脚本:

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中检索表,但是我无法将其动态发送到该脚本。谁能帮我这个忙。

sql sql-server ssms
1个回答
0
投票

要在运行时动态更改表名,您将需要诸如sp_executesql之类的东西。请参阅此处以获取其用法示例:https://stackoverflow.com/a/3556554/22194

然后,您可以有一个外部游标,该游标获取表名,然后将查询组合为字符串并执行它们。它看起来会很恐怖。

如果您的架构没有太大变化,另一种方法是为每个表生成一个带有一部分的长脚本。您可以通过查询表名然后使用每个不同的表名重复脚本来生成脚本。 Excel实际上非常适合做这种事情-将表格名称粘贴到Excel中,使用Excel生成脚本,然后将其复制/粘贴回SSMS。

这将是一个冗长的重复脚本,但可以避免将所有SQL都放在字符串中的缺点。

© www.soinside.com 2019 - 2024. All rights reserved.