【发布时间】:2021-07-07 22:35:11
【问题描述】:
我需要帮助来优化此处显示的存储过程。它可以工作,但是当它运行时,它会为每个数据库生成一个选择脚本。我需要存储过程来联合所有的选择语句。
有人知道怎么做吗?
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
IF OBJECT_ID('tempdb.dbo.#database') IS NOT NULL
DROP TABLE #database
CREATE TABLE #database
(
id INT IDENTITY PRIMARY KEY,
name sysname
)
SET NOCOUNT ON
BEGIN
INSERT INTO #database(name)
SELECT name
FROM master.sys.databases
WHERE name IN (SELECT [DATABASE] COLLATE Latin1_General_CI_AS
FROM SETTINGS.DBO.SETTINGS
WHERE [KEY] = 'DB_NAME' AND SETTING = '1' )
ORDER BY name
END
DECLARE @id INT, @cnt INT, @sql NVARCHAR(max), @currentDb sysname;
SELECT @id = 1, @cnt = MAX(id)
FROM #database
WHILE @id <= @cnt
BEGIN
SELECT @currentDb = name
FROM #database
WHERE id = @id
SET @sql = 'select * FROM ' + @currentDb + '.dbo.People'
PRINT @sql
EXEC (@sql);
PRINT '--------------------------------------------------------------------------'
SET @id = @id + 1;
END
DROP TABLE #database
END
【问题讨论】:
-
您可以尝试创建一个大型查询字符串,在每次迭代中将
UNIONs 或INSERT放入一个临时表中,最后将SELECT放入一个临时表中。 (不过,保存数据库名称的临时表并不是必需的。您可以直接在sys.databases中的SELECT上使用光标。) -
旁注:您应该使用
quotename()以安全的方式格式化@currentDb,然后再将其添加到查询中。 -
@Mags 你过得怎么样?下面的回答解决了你的问题吗?你熟悉“接受”和回答吗?
标签: sql sql-server tsql stored-procedures union-all