我需要在许多数据库上运行以下查询,我有超过100个数据库,但我不想拉出每个数据库并一次运行一个查询。
用户表仅列在Database#_Account
。
如果查询已运行,则会因为Database#_Admin
没有User
表而错误输出。
(示例数据库列表)
Database:
---------------------
MASTER
Model
msdb
tempdb
Database1_Account
Database1_Admin
Database2_Account
Database2_Admin
Database3_Account
Database3_Admin
查询:
EXEC sp_MsForEachDb @command1 = SELECT "?" as DatabaseName, *
FROM ?.User
WHERE Name = "John" AND "?" LIKE "%_Account"
答案 0 :(得分:2)
ms_foreachDb
仍然是一个无证件的功能,随时可能发生变化。我会使用光标这样的东西。
这是一个可以帮助您入门的工作模板:
DECLARE @tsql nvarchar(max)
DECLARE @dbname varchar(500)
DECLARE MyCur CURSOR STATIC FORWARD_ONLY FOR
SELECT [name]
FROM sys.databases
WHERE [name] NOT IN ('tempdb')
OPEN MyCur
WHILE (1=1)
BEGIN
FETCH NEXT FROM MyCur INTO @dbname
IF @@FETCH_STATUS <> 0
BREAK
SET @tsql = 'use ' + @dbname + ' SELECT * FROM sys.tables'
EXEC sp_executesql @tsql
END
CLOSE MyCur;
DEALLOCATE MyCur;
答案 1 :(得分:0)
Database.Schema.Table
,而不是Database.Table
。我假设所有表都使用默认的dbo
架构。IF OBJECT_ID(N'TableName') IS NOT NULL
。尝试:
EXEC sp_MsForEachDb @command1 = N'IF OBJECT_ID(N''?.dbo.User'') IS NOT NULL SELECT ''?'' as DatabaseName, * FROM ?.dbo.User WHERE Name = ''John'' AND ''?'' LIKE ''%_Account'''
答案 2 :(得分:0)
Here's the query我用来做一个while循环来迭代数据库。
只需将您的代码放在“PUT CODE HERE”的位置。
SET NOCOUNT ON
DECLARE @Database TABLE (DbName SYSNAME)
DECLARE @DbName AS SYSNAME
SET @DbName = ''
INSERT INTO @Database (DbName)
SELECT NAME
FROM master.dbo.sysdatabases
WHERE NAME <> 'tempdb'
ORDER BY NAME ASC
WHILE @DbName IS NOT NULL
BEGIN
SET @DbName = (
SELECT MIN(DbName)
FROM @Database
WHERE DbName > @DbName
)
/*
PUT CODE HERE
EXAMPLE PRINT Database Name
*/
PRINT @DbName
END
要创建符合特定条件的用户列表,您可以修改this script。