テーブルのコレクション (100 以上) があり、そのすべてに 2 つのフィールドが含まれています
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 が多くの場合、2005 年より前に Cursors が行っていたことを実現できることも知りました。
私がする必要があるのは、データベース内のすべてのテーブルを調べて、RowChanged = 1 および ChangedFields が '' または NULL のような条件をチェックすることです。
私はこれを TVF などで解決しようとしましたが、不足し続けています。1 つのテーブルで操作を行うことはできましたが、sys.tables からリストを取得して複数のテーブルで何かを行うことはできませんでした。