我希望在多个数据库上运行查询。我已经看过这个功能了;
sp_MsForEachDb
哪个好,但它贯穿所有数据库,我只想使用其中的一些。有没有办法选择运行哪些数据库?同样在这些数据库中,我们有分支(因此所有表都有BranchID列)。例如,数据库1可能有分支4,5和6,我们只需要分支5.数据库2也可能有分支4,5和6,但在这一个我们想要分支4和5.有没有办法选择哪个根据正在运行的数据库运行分支?
这可以在SSIS或类似的东西上完成吗?
希望这是有道理的!
答案 0 :(得分:1)
我使用一个简单的游标来完成这个....它非常简单,您可以在数据库列表中运行任何语句。
--Drop temporary tables if they already exists.
IF OBJECT_ID('tempdb..#DatabaseNames') IS NOT NULL
DROP TABLE #DatabaseNames
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
--Create a temporary table.
CREATE TABLE #DatabaseNames
(
DBName varchar(100),
Active bit
)
GO
--Create a temporary table to store results.
CREATE TABLE #Results
(
FirstName varchar(100),
WebLogin varchar(100)
)
GO
--It's the long way to do this but just showing for the sake of the example.
INSERT INTO #DatabaseNames
VALUES ('Database1', 1)
INSERT INTO #DatabaseNames
VALUES ('Database2', 0)
INSERT INTO #DatabaseNames
VALUES ('Database3', 1)
INSERT INTO #DatabaseNames
VALUES ('TIER1', 1)
INSERT INTO #DatabaseNames
VALUES ('Northwind', 1)
DECLARE @DBName varchar(20)
DECLARE @SQL varchar(2000)
--Start cursor
DECLARE LoopCursor CURSOR FOR
SELECT DBName AS 'DBName'
FROM #DatabaseNames
WHERE DBName NOT IN ('TIER1', 'Northwind')
AND Active = 1
OPEN LoopCursor
FETCH NEXT FROM LoopCursor
INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = '
INSERT INTO #Results
SELECT FirstName, WebLogin
FROM ' + @DBName + '.dbo.Users
WHERE FirstName = ''User1''
AND LastName = ''User1''
AND WebLogin = ''User1Login'''
EXEC(@SQL)
--Print @DBName
FETCH NEXT FROM LoopCursor
INTO @DBName
END
SELECT *
FROM #Results
CLOSE LoopCursor
DEALLOCATE LoopCursor
我再次修改了我的答案,继续你最后的评论,想要将所有结果放在一个表格中。您可以添加另一个临时表,只需将数据插入其中即可。完成后,在关闭光标之前从该表中选择。至于在WHERE
子句中有多个条件,您可以用2个单引号括起单引号,因此WHERE name = 'MyName'
变为WHERE name = ''MyName''