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;
浙公网安备 33010602011771号