我想更新模式中每个表中的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中检索表,但是我无法将其动态发送到该脚本。谁能帮我这个忙。
要在运行时动态更改表名,您将需要诸如sp_executesql之类的东西。请参阅此处以获取其用法示例:https://stackoverflow.com/a/3556554/22194
然后,您可以有一个外部游标,该游标获取表名,然后将查询组合为字符串并执行它们。它看起来会很恐怖。
如果您的架构没有太大变化,另一种方法是为每个表生成一个带有一部分的长脚本。您可以通过查询表名然后使用每个不同的表名重复脚本来生成脚本。 Excel实际上非常适合做这种事情-将表格名称粘贴到Excel中,使用Excel生成脚本,然后将其复制/粘贴回SSMS。
这将是一个冗长的重复脚本,但可以避免将所有SQL都放在字符串中的缺点。