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)
你可以试试这个:
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)
您不需要为此使用循环。您可以使用系统视图来生成动态 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)