我有一个表集合(100+),所有表都包含两个字段
RowChanged bit
ChangedFields bit
现在,发生了一个错误,当 ChangedFields 为空时,一些条目的 RowChanged = 1。因此,我需要检查这些并设置 RowChanged = 0 ,其中 ChangedFields 为空。
我通过以下光标实现了这一点。
BEGIN TRANSACTION
USE DatabaseName --Database name to clean
DECLARE @Table_Name VARCHAR(50)
DECLARE @Query VARCHAR(250)
DECLARE Table_Cursor CURSOR FOR SELECT Name FROM sys.tables;
DECLARE @Affected_Rows INTEGER = 0
OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @Table_Name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Query = 'Update '+@Table_Name+' Set RowChanged = 0 Where RowChanged = 1 And (LEN(RTRIM(CONVERT(NVARCHAR(100), ChangedFields))) = 0 OR ChangedFields IS NULL)'
EXEC (@Query)
SET @Affected_Rows = @Affected_Rows + COALESCE(@@ROWCOUNT, 0)
FETCH NEXT FROM Table_Cursor INTO @Table_Name
END
SELECT @Affected_Rows AS Affected_Rows
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
ROLLBACK --Change to COMMIT in order to save changes
虽然这确实有效,但我对使用游标有一种基因厌恶。此外,我刚刚了解到 Apply 在许多情况下可以实现 Cursors 在 2005 年之前所做的事情。
我需要做的是检查数据库中的所有表并检查 RowChanged = 1 和 ChangedFields (如 '' 或 NULL )的条件。
我试过用 TVF 来解决这个问题,但我一直在做空。虽然我可以在单个表中执行操作,但从 sys.tables 获取列表并在多个表上执行某些操作让我望而却步。