查询SQL Server中未完成指定版本升级的数据库
解决方案
可以通过动态SQL遍历所有非系统数据库,检查每个数据库中[dbo].[Product_Version]表的Migrations_History列是否存在目标值,最终返回未升级的数据库名称。以下是完整的SQL语句:
DECLARE @DBName NVARCHAR(128) DECLARE @SQL NVARCHAR(MAX) DECLARE @Result TABLE (DBName NVARCHAR(128)) -- 遍历所有非系统在线数据库 DECLARE DB_Cursor CURSOR FOR SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb') AND state_desc = 'ONLINE' OPEN DB_Cursor FETCH NEXT FROM DB_Cursor INTO @DBName WHILE @@FETCH_STATUS = 0 BEGIN -- 构建动态SQL,分两种情况判断未升级状态 SET @SQL = N' IF EXISTS (SELECT 1 FROM [' + @DBName + N'].sys.tables WHERE name = ''Product_Version'' AND schema_id = SCHEMA_ID(''dbo'')) BEGIN IF NOT EXISTS (SELECT 1 FROM [' + @DBName + N'].dbo.Product_Version WHERE Migrations_History = ''20230724_v5.0.0'') BEGIN INSERT INTO @Result (DBName) VALUES (''' + @DBName + N''') END END ELSE BEGIN -- 无Product_Version表的数据库视为未升级 INSERT INTO @Result (DBName) VALUES (''' + @DBName + N''') END' EXEC sp_executesql @SQL, N'@Result TABLE (DBName NVARCHAR(128)) OUTPUT', @Result OUTPUT FETCH NEXT FROM DB_Cursor INTO @DBName END CLOSE DB_Cursor DEALLOCATE DB_Cursor -- 返回最终结果 SELECT DBName AS 未升级数据库名称 FROM @Result
说明
- 仅检查用户创建的在线数据库,自动排除系统库(master、model、msdb、tempdb)
- 覆盖两种未升级场景:
- 存在
Product_Version表但未记录目标升级版本 - 不存在
Product_Version表(未执行基础升级脚本的数据库)
- 存在
- 借助游标和动态SQL实现跨库批量检查
内容的提问来源于stack exchange,提问作者NewOne
相关产品推荐
相关产品推荐

