t-sql for循环遍历表

时间:2017-10-26 17:29:43

标签: sql-server tsql for-loop

我尝试在表列表上执行相同的操作序列,这些表是使用where子句选择的。

Select table_name 
From INFORMATION_SCHEMA.COLUMNS 
Where column_name = 'fieldA';

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

for i in @tablelist:

    alter table i add new_col varchar(8);
    update i set new_col = old_col;

4 个答案:

答案 0 :(得分:3)

你可以试试这个:

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

答案 1 :(得分:3)

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

for f in PyFooWrapper.py_get_foos():
    print(f.bar())

答案 2 :(得分:1)

完成此操作的一种方法是将要更改的表列表提供给SQL游标,并遍历游标以在每个表上执行ALTER table命令。有关如何创建SQL游标的文档可以在这里找到: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql

实现此目的的另一种方法是在SQL中使用带有计数迭代器的while循环。有关此解决方案的信息,请访问: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/while-transact-sql

答案 3 :(得分:1)

对于循环,您必须使用cursors或者使用exists构造,每次处理时都会从临时表中删除条目。

对于将表名传递给查询,如果不创建动态SQL查询,则无法执行此操作。您可以通过在字符串中创建查询并将表名称连接到正确的位置来实现。如果有任何空格或奇怪的字符,请使用QUOTENAME函数执行名称引用。

光标示例:

DECLARE @tables TABLE (
    Name SYSNAME
);
DECLARE @tableName SYSNAME;
DECLARE @sql NVARCHAR(4000);

INSERT INTO @tables
SELECT i.table_name
FROM INFORMATION_SCHEMA.COLUMNS i
WHERE i.column_name = 'fieldA';

DECLARE cur CURSOR LOCAL FAST_FORWARD
FOR
SELECT Name
FROM @tables;

OPEN cur;

FETCH NEXT FROM cur
INTO @tableName;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = N'ALTER TABLE ' + QUOTENAME(@tableName) + N' ADD new_col varchar(8);';
    SET @sql = @sql + N'UPDATE ' + QUOTENAME(@tableName) + N' SET new_col = old_col;';

    EXEC sp_executesql @sql;

    FETCH NEXT FROM cur
    INTO @tableName;    
END

CLOSE cur;
DEALLOCATE cur;
相关问题