t-sql for 循环遍历表

jos*_*123 4 t-sql sql-server for-loop

我试图对使用子句选择的表列表执行相同的操作序列where

Select table_name 
From INFORMATION_SCHEMA.COLUMNS 
Where column_name = 'fieldA';
Run Code Online (Sandbox Code Playgroud)

这会生成一个表名称列表 - 这些是我想要用 for 循环处理的表。有没有办法迭代这个表列表,像这样?

for i in @tablelist:

    alter table i add new_col varchar(8);
    update i set new_col = old_col;
Run Code Online (Sandbox Code Playgroud)

LON*_*ONG 7

你可以试试这个:

DECLARE @Table TABLE
(
TableName VARCHAR(50),
Id int identity(1,1)
)


INSERT INTO @Table
Select table_name From INFORMATION_SCHEMA.COLUMNS 
Where column_name = 'fieldA'

DECLARE @max int
DECLARE @SQL VARCHAR(MAX) 
DECLARE @TableName VARCHAR(50)
DECLARE @id int = 1

select @max = MAX(Id) from @Table


WHILE (@id <= @max)
BEGIN

SELECT @TableName = TableName FROM @Table WHERE Id = @id
SET @SQL =     'alter table '+ @TableName +' add new_col varchar(8);
                update '+ @TableName + ' set new_col = old_col;'
PRINT(@SQL)  --COMMENT THIS LINE OUT AND COMMENT IN THE NEXT EXEC(@SQL) IF YOU SEE THE CORRECT OUTPUT
--EXEC(@SQL)
SET @id = @id +1
END
Run Code Online (Sandbox Code Playgroud)


Sea*_*nge 6

您不需要为此使用循环。您可以使用系统视图来生成动态 sql,这比循环更简单(也更快)。

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'alter table ['+ c.TABLE_NAME +'] add new_col varchar(8);
                update ['+ c.TABLE_NAME + '] set new_col = old_col;'
from INFORMATION_SCHEMA.COLUMNS c
where c.COLUMN_NAME = 'fieldA'

select @SQL
--uncomment below when you are satisfied with the dynamic sql
--exec sp_executesql @SQL
Run Code Online (Sandbox Code Playgroud)