无法遍历所有表格和列

时间:2014-07-28 17:16:14

标签: sql-server-2008 tsql

我正在处理数据库脚本,我需要遍历所有表和列,我的脚本是

begin
declare @counter int, @tblName varchar(50), @columnNames varchar(100),@collection varchar(200)
SET @counter=1
SET @tblName=''
SET @columnNames=''
SET @collection=''
WHILE @counter<=(SELECT COUNT(table_name) from INFORMATION_SCHEMA.TABLES)
begin
    select @tblName=table_name from INFORMATION_SCHEMA.TABLES where TABLE_NAME not in (@collection)
    select @columnNames=@columnNames + column_name+' : ' from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@tblName

    if(@counter=1)
    SET @collection = @tblName
    else
    SET @collection = @collection +','+@tblName

    Print 'Table : '+@tblName
    Print 'Columns : '+@columnNames
    Print 'Collection : '+@collection

    SET @counter = @counter+1
end
end

但问题是它只是迭代了2个表,我想出的问题是在这部分

WHERE table_name not in (@collection)

但是我无法解决这个问题..

我的输出是

Table : tbl1
Columns : column1 : Column 2 : column 3
Collection : tbl1

Table : tbl2
Columns : column1 : Column 2 : column 3
Collection : tbl1,tbl2

Table : tbl1
Columns : column1 : Column 2 : column 3
Collection : tbl1,tbl2,tbl1

thanx任何帮助

1 个答案:

答案 0 :(得分:0)

您不能将包含'a,b,c'的字符串用作IN()(因为它不是一组)。

而是声明一个表变量:

declare @collection table (name varchar(max) not null)

并在循环中插入@tblName

insert @collection values (@tblName)

修改where子句:

... where TABLE_NAME not in (select name from @TableVar)