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

本文介绍如何使用SQL游标遍历多个数据库实例,并执行特定查询,包括使用`FOR`循环、`OPEN`、`FETCH`、`WHILE`循环、`CLOSE`和`DEALLOCATE`语句。通过示例展示了如何筛选数据库名称、执行特定数据库操作及使用游标进行数据遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

declare @name varchar(100)
DECLARE My_Cursor CURSOR --定义游标
FOR (SELECT Name FROM Master..SysDatabases
where name NOT IN ('master','model','msdb','tempdb') ) --查出需要的集合放到游标中
OPEN My_Cursor; --打开游标
FETCH NEXT FROM My_Cursor INTO @name   
WHILE @@FETCH_STATUS = 0
BEGIN

if exists(select 1 from  sysobjects where xtype='u' and name like '%qq%')
select name from sysobjects where xtype='u' and name like '%qq%'
FETCH NEXT FROM My_Cursor INTO @name 
END

CLOSE MY_CURSOR
DEALLOCATE My_Cursor

  其中QQ可以替换成自己想要的条件哦

 

PS:有问题改了下还是不行,有知道的人吗?

declare @name varchar(100)
declare @sql varchar(100)
DECLARE My_Cursor CURSOR --定义游标
FOR (SELECT Name FROM Master..SysDatabases
where name NOT IN ('master','model','msdb','tempdb','ReportServer','ReportServerTempDB') ) --查出需要的集合放到游标中
OPEN My_Cursor; --打开游标
FETCH NEXT FROM My_Cursor INTO @name   
WHILE @@FETCH_STATUS = 0
BEGIN

select @sql='use '+@name
EXEC sp_sqlexec @Sql
--select @name from Master..SysDatabases
--if exists(select 1 from  sysobjects where xtype='u' )--
select * from sysobjects where xtype='u'-- and name like '%sys%'
FETCH NEXT FROM My_Cursor INTO @name 
END


CLOSE MY_CURSOR
DEALLOCATE My_Cursor

  

DECLARE @dbname VARCHAR(50);
DECLARE @i INT =1; 
DECLARE @maxid INT=0;
CREATE TABLE #temp(
	id int Identity(1,1),
	dbname varchar(50)
)
DECLARE @sql VARCHAR(max)='';
INSERT INTO #temp
        (dbname )
SELECT NAME  FROM master.sys.SysDatabases where name NOT IN ('master','model','msdb','tempdb')
SELECT @maxid=MAX(id) FROM #temp
WHILE @i<@maxid
BEGIN
	DECLARE @db VARCHAR(50)='';
	SELECT @db=dbname FROM #temp WHERE id=@i
	PRINT @db
	IF @i<>1 AND  @i<>@maxid
	BEGIN
		SET @sql+=' UNION ALL'
	END
	SET @sql+=' SELECT * FROM '+@db+'.INFORMATION_SCHEMA.TABLES ' 
	SET  @i+=1;
END
DROP TABLE #temp
EXEC(@sql)

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

sp_MSForEachDB @command1='USE ?;
 
SELECT o.name AS tablename,c.name AS columnname,t.name AS datatype, *
  FROM sys.[columns] AS c
INNER JOIN sys.objects AS o ON c.[object_id]=c.[object_id]
INNER JOIN sys.types AS t ON t.user_type_id=c.user_type_id
WHERE o.[type]=''U'''

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值