我正試圖針對同一服務器上的多個資料庫運行一個查詢。
我需要根據資料庫中第三個表的標準,從資料庫中的兩個表中提取所有的值,如果資料庫是在某個日期之后創建的。
我有一個查詢來尋找資料庫的創建時間:
我有一個查詢來尋找資料庫的創建時間:
SELECT *
FROM sys.databases
WHERE STATE = 0 --忽略脫機資料庫
AND database_id > 4 --不包括master, model, msdb, tempdb
AND create_date > CONVERT(datetime, '2021-01-01')
而我需要在每個資料庫上運行的查詢一般如下:
SELECT *
FROM Table1
INNER JOIN Table3 ON Table3.Column6=Table1.Column2
AND Table3.Column3='Value1'。
AND Table3.Column4='Value2'
INNER JOIN Table2 ON Table3.Column6=Table2.Column2
我確實找到了這個問題,這基本上是我想做的,但是當我看 INFORMATION_SCHEMA.TABLES 時,TABLE_CATALOG 列沒有我想查詢的表名。我想我可以像上面那樣從 sys.databases 表中提取名稱,所以我試著把它修改為:
<DECLARE @cmd VARCHAR(max) = N''/span>
SELECT @cmd = COALESCE(@cmd ' UNION ALL '/span>, ' ') ' SELECT *
FROM [' name '] .dbo.Table1
INNER JOIN [' name '] .dbo.Table3 on Table3.Column6=Table1.Column2
AND Table3.Column3=''Value1''
AND Table3.Column4=''Value2''
INNER JOIN [' name '] .dbo.Table2 on Table3.Column6=Table2.Column2'
FROM sys.databases
WHERE STATE= 0
and database_id>4
and create_date>CONVERT(datetime,'2021-08-26')
SET @cmd = STUFF(@cmd, CHARINDEX('UNION ALL', @cmd), 10, ' ' )
PRINT @cmd @cmd
EXEC(@cmd)
但是當我以早于2021-08-26的日期運行它時(抓取超過5個表),我得到一個記憶體錯誤。我需要至少運行到四月初(最好是到年初),這將抓取大約500個表。
在SQL中針對多個資料庫運行查詢的推薦方式是什么?
uj5u.com熱心網友回復:
我的建議是,不要試圖建立一個龐大的UNION ALL動態SQL陳述句,你應該建立一個#temp表來保存每個輸出的結果,然后更容易向每個資料庫發送相同的字串:
CREATE TABLE #hold(dbname sysname, Column1 {data type}, ...)。
DECLARE @sql nvarchar(max), @exec nvarchar(1024)。
SET @sql = N'SELECT DB_NAME(), *
FROM dbo.Table1
INNER JOIN dbo.Table3
ON Table3.Column6 = Table1.Column2
AND Table3.Column3 = ''Value1'' 。
和Table3.Column4 = ''Value2'' 。
INNER JOIN dbo.Table2
ON Table3.Column6 = Table2.Column2;'。
DECLARE @dbname sysname, @c cursor;
SET @c = CURSOR FORWARD_ONLY STATIC READ_ONLY FOR
SELECT name FROM sys.databases
WHERE state = 0 --忽略脫機資料庫
AND database_id > 4 --不包括master, model, msdb, tempdb
AND create_date > CONVERT(datetime, '202101')。
OPEN @c;
FETCH NEXT FROM @c INTO @dbname;
WHILE @@FETCH_STATUS=0
BEGIN
SET @exec = QUOTENAME(@dbname) N' 。 sys.sp_executesql'。
INSERT #hold EXEC @exec @sql;
FETCH NEXT FROM @c INTO @dbname;
END;
SELECT * FROM #hold;
你也可以考慮投資sp_ineachdb,這是我寫的一個程序,幫助簡化在每個資料庫的背景關系中運行相同的命令。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/332028.html
標籤:
