如何使用循环更新 SQL Server 数据库中的所有表

ahm*_*ady -1 sql sql-server sql-server-2005

我在数据库中的所有表中有一个公共列,我需要通过所有表中的循环来更新此列的值

我尝试使用这段代码但没有发生任何事情

DECLARE TBL_CURSOR CURSOR
FOR ( SELECT Name FROM Sysobjects WHERE Type='U' )

DECLARE @SQL NVARCHAR(MAX);
SET @SQL = '';

DECLARE @TblName NVARCHAR(MAX);

OPEN TBL_CURSOR

FETCH NEXT FROM TBL_CURSOR INTO @TblName

BEGIN

   SET @SQL = ' If not exists (select column_name from INFORMATION_SCHEMA.columns where  table_name = '+ @TblName +' and column_name = "CommonColumn") update ' + @TblName + ' set CommonColumn= 1 ';
  FETCH NEXT FROM TBL_CURSOR INTO @TblName
END

CLOSE TBL_CURSOR
DEALLOCATE TBL_CURSOR

EXEC (@SQL);
Run Code Online (Sandbox Code Playgroud)

有人有更好的想法或修复此代码吗?

Spo*_*ock 5

您的代码的问题是 if 语句...您正在更新该列(如果它不存在)。

If not exists (select column_name from INFORMATION_SCHEMA....
Run Code Online (Sandbox Code Playgroud)

此外,您每次都会覆盖 @SQL 的值,而不是附加到它。

SET @SQL = ' If not exists....
Run Code Online (Sandbox Code Playgroud)

您不需要循环来执行此操作。您可以使用一个查询构建更新语句,然后执行它。尝试这个

DECLARE @SQL        NVARCHAR(MAX);
SET @SQL = '';
SELECT @SQL = @SQL + 'UPDATE ' + QUOTENAME(o.name) + ' SET ' + QUOTENAME(c.name) + ' = 1
'
FROM sysobjects o
    JOIN syscolumns c ON o.id = c.id
WHERE c.name = 'CommonColumn'
AND o.type = 'U'

EXEC (@SQL);
Run Code Online (Sandbox Code Playgroud)