首页 > 解决方案 > 如何跨多个数据库使用临时表?

问题描述

我的脚本在这里使用特定名称遍历我的所有数据库并收集计数。这可行,但我的问题是我想将所有结果合并到集合中,以便我可以以 CSV 或类似格式导出。否则要从结果视图中复制大量数据。

我试图声明一个@temp 表,文件的开头,然后插入其中,但它不起作用。我怀疑对每个数据库的调用都在一个新的连接中,因此它失败了。我可以制作一个可以写回的内存表,然后从中选择所有内容吗?

DECLARE @DB_Name varchar(100) 
DECLARE @Command nvarchar(200) 
DECLARE database_cursor CURSOR FOR 
SELECT name 
FROM MASTER.sys.sysdatabases 
where name like '%_MSCRM%'

OPEN database_cursor 



FETCH NEXT FROM database_cursor INTO @DB_Name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
     SELECT @Command = 'SELECT ' + '''' + @DB_Name + '''' + ' as Tenant, count(*) as Count  FROM [' + @DB_Name + '].[dbo].[si_RecruitBase]'
     EXEC sp_executesql @Command 

     FETCH NEXT FROM database_cursor INTO @DB_Name 
END 

CLOSE database_cursor 
DEALLOCATE database_cursor 

标签: sqlsql-server

解决方案


您可以在不创建自己的光标的情况下执行此操作。

-- Create a temp table to store the results
CREATE TABLE #Results(Tenant NVARCHAR(255), Amount INT)

-- use sp_MsForEachDb to loop over all databases
exec sp_MSForEachDb '
    -- Filter on your specific database
    IF ''?'' LIKE ''%_MSCRM%''
    BEGIN
        INSERT INTO #Results(Tenant, Amount)
        SELECT  ''?''  as Tenant, count(*) as Count  FROM [?].[dbo].[si_RecruitBase]
    END
'

-- show the results
SELECT *
FROM #Results

推荐阅读