我想要更新给定模式中每个表中的列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中的表,但不能动态地将这些表发送到此脚本。有谁能帮我一下吗?
发布于 2019-11-05 22:16:33
要在运行时动态更改表名,您将需要类似于sp_executesql的代码。有关其用法的示例,请参阅此处:https://stackoverflow.com/a/3556554/22194
然后,您可以使用一个外部游标来获取表名,然后将查询组装成一个字符串并执行它们。不过,这看起来会很可怕。
如果您的模式没有太大变化,另一种方法是为每个表生成一个包含部分的长脚本。您可以通过查询表名,然后对每个不同的表名重复该脚本来生成脚本。Excel实际上可以很好地完成这类工作--将表名粘贴到Excel中,使用Excel生成脚本,然后将其复制/粘贴回SSMS。
这将是一个冗长的重复脚本,但可以避免将所有SQL都放在字符串中的缺点。
https://stackoverflow.com/questions/58713003
复制相似问题