我正在处理数据库脚本,我需要遍历所有表和列,我的脚本是
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任何帮助
答案 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)