这是一个关于逻辑的问题,可以帮助我更多地了解如何迭代到我的数据库中。
在我的服务器上,我有几个 AdventureWorks* 数据库:
我有一个冷查询帮助我遍历我的所有数据库 AdventureWorks* 而不是:
CREATE TABLE #LIst_DB (name nvarchar(128))
INSERT INTO #LIst_DB
select name from sys.databases
WHERE database_id > 4
AND state = 0;
select * from #LIst_DB
DROP TABLE #LIst_DB
对于每个 AdventureWorks* 数据库,我想AWBuildVersion
在每个 DB 旁边列出:
此时我很困惑,因为有两个问题我不知道如何解决:
- 如何
select [Database Version] from AWBuildVersion
为每个数据库运行一个? - 如果数据库没有
AWBuildVersion
表怎么办?
在这里我找到了这个查询:
DECLARE @SQL NVARCHAR(max)
SET @SQL = stuff((
SELECT '
UNION
SELECT ' + quotename(NAME, '''') + ' as Db_Name, Name collate SQL_Latin1_General_CP1_CI_AS as Table_Name
FROM ' + quotename(NAME) + '.sys.tables WHERE NAME = @TableName '
FROM sys.databases
ORDER BY NAME
FOR XML PATH('')
,type
).value('.', 'nvarchar(max)'), 1, 8, '')
--PRINT @SQL;
EXECUTE sp_executeSQL @SQL
,N'@TableName varchar(30)'
,@TableName = 'AWBuildVersion'
这使我接近我的目标,但它显示了AWBuildVersion
我需要列 Database Version = 11.0.2100.60的表名
我不想用 T-SQL 这样做,因为它限制了我可以从中获得结果的服务器数量。
相反,我会创建一个这样的 PowerShell 脚本:
您确实需要dbatools powershell 模块来运行它。
它的作用是:
内联评论:
我可能会使用
sp_foreachDB
Brent Ozar 的First Responder Kit中的内容:尚未对此进行测试,但我相信语法应该可以工作。