欢迎来到Introzo百科
Introzo百科
当前位置:网站首页 > 技术 > 使用游标实现SQL查询当前服务器所有数据库中的所有表

使用游标实现SQL查询当前服务器所有数据库中的所有表

日期:2023-10-01 12:53

-->
声明@name varchar(100)
DECLARE My_Cursor CURSOR --定义光标
FOR(从 Master..SysDatabases 中选择名称
where name NOT IN ('master','model','msdb','tempdb') ) --找出需要的集合放入光标
打开我的光标; --打开光标
从 My_Cursor 获取下一个到 @name
当@@FETCH_STATUS = 0
开始 如果存在(从 sysobjects 中选择 1,其中 xtype='u' 且名称如 '%qq%')
从 sysobjects 中选择名称,其中 xtype='u' 且名称如 '%qq%'
从 My_Cursor 获取下一个到 @name
结尾 关闭我的光标
解除分配 My_Cursor

  可以将QQ替换成你想要的条件

PS:有问题,修好后还是不行。有人知道吗?

声明@name varchar(100)
声明@sql varchar(100)
DECLARE My_Cursor CURSOR --定义光标
FOR(从 Master..SysDatabases 中选择名称
where name NOT IN ('master','model','msdb','tempdb','ReportServer','ReportServerTempDB') ) --查出需要的集合放置游标中
打开我的光标; --打开游标
从 My_Cursor 获取下一个到 @name
当@@FETCH_STATUS = 0
开始 选择@sql='使用'+@name
EXEC sp_sqlexec @Sql
--从Master..SysDatabases中选择@name
--if 存在(从 sysobjects 中选择 1,其中 xtype='u' )--
select * from sysobjects where xtype='u'-- 名称如 '%sys%'
从 My_Cursor 获取下一个到 @name
结尾 关闭我的光标
解除分配 My_Cursor

  

声明 @dbname VARCHAR(50);
声明 @i INT =1;
声明 @maxid INT=0;
创建表#temp(
id int 身份(1,1),
数据库名称 varchar(50)
)
声明 @sql VARCHAR(max)='';
插入#temp
(数据库名称)
从 master.sys.SysDatabases 中选择名称,其中名称不在 ('master','model','msdb','tempdb')
从#temp
中选择@maxid=MAX(id) 而@i<@maxid
开始
声明 @db VARCHAR(50)='';
SELECT @db=dbname FROM #temp WHERE id=@i
打印@db
IF @i<>1 和 @i<>@maxid
开始
SET @sql+='UNION ALL'

SET @sql+=' SELECT * FROM '+@db+'.INFORMATION_SCHEMA.TABLES '
设置@i+=1;

删除表#temp
执行(@sql)

  经过千辛万苦,找到了方法,正确的方法如下:

sp_MSForEachDB @command1='使用?; SELECT www.introzo.com AS 表名,www.introzo.com AS 列名,www.introzo.com AS 数据类型, *
FROM sys.[列] AS c
INNER JOIN sys.objects AS o ON c.[object_id]=c.[object_id]
内连接 sys.types AS t ON t.user_type_id=c.user_type_id
WHERE o.[type]=''U'''

  

-->