sqlserver遍历所有表和所有字段,双游标循环。
--sqlserver遍历所有表和所有字段,双游标循环。 begin declare @TableIdInt int declare @TableNameStr varchar(50) declare @ColumnIdInt int declare @ColumnNameStr varchar(50) --临时表是否存在 declare @temptableCount int --声明内存表(非临时表) declare @t table( tablename varchar(50), columnname varchar(50) ) ---------------------------------------------- --判断临时表是否存在 select @temptableCount=count(1) from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#AllTableAndColumn') and type='U' print(@temptableCount); if(@temptableCount<=0) begin --创建临时表 create table #AllTableAndColumn( tableid int, tablename varchar(50), columnid int, columnname varchar(50) ) end else begin --清空临时表 delete from #AllTableAndColumn print('清空了#AllTableAndColumn表') end ---------------------------------------------- --声明游标 declare table_cursor cursor --"CloudBSS_Dev_20220211"是数据库名 --XType='U'--:表示所有用户表; --XType='S':表示所有系统表; for(Select id,Name FROM CloudBSS_Dev_20220211..SysObjects Where XType='U') --打开游标 open table_cursor --开始循环游标变量 fetch next from table_cursor into @TableIdInt,@TableNameStr --遍历所有的数据,@@FETCH_STATUS函数返回值为0表示FETCH语句执行成功 while @@FETCH_STATUS = 0 begin ---------------------------------------------- --声明游标 declare column_cursor cursor for(Select id,Name FROM SysColumns Where id=Object_Id(@TableNameStr)) --打开游标 open column_cursor --开始循环游标变量 fetch next from column_cursor into @ColumnIdInt,@ColumnNameStr --遍历所有的数据,@@FETCH_STATUS函数返回值为0表示FETCH语句执行成功 while @@FETCH_STATUS = 0 begin insert #AllTableAndColumn select @TableIdInt,@TableNameStr,@ColumnIdInt,@ColumnNameStr; --转到下一个游标,没有会死循环。 fetch next from column_cursor into @ColumnIdInt,@ColumnNameStr; end --关闭游标 close column_cursor; --释放游标 deallocate column_cursor; ---------------------------------------------- --转到下一个游标,没有会死循环。 fetch next from table_cursor into @TableIdInt,@TableNameStr; end ---------------------------------------------- --关闭游标 close table_cursor; --释放游标 deallocate table_cursor; --查询结果 select * from #AllTableAndColumn order by tablename,columnname; end;