【问题标题】:Use Temp Table to merge query results from different DBs使用 Temp Table 合并来自不同数据库的查询结果
【发布时间】:2018-03-22 21:27:48
【问题描述】:

我需要将不同数据库中的数据提取到一个表中。这些数据库都在同一个服务器和实例中,并且它们具有相同的结构。其中一列是 DB Name,其他列来自同一个表。

我可以编写一个查询来提取这些数据,每个数据库都有一个表,但我想将所有结果合并到一个表中。

我尝试使用临时表来保存单个结果,但结果是一个空表。似乎每次查询后都会清空表#tmpTable。我在这里发布我的尝试:

CREATE TABLE [dbo].#tmpTable ([DbName] VARCHAR(MAX), [Example] VARCHAR(MAX))

EXECUTE sp_MSForEachDB 
    'USE ?;     
    DECLARE @ExampleQuery AS NVARCHAR(MAX) = 
             ''SELECT DB_NAME() AS [DbName], [Example] 
               INTO   #tmpTable 
               FROM   [tConfig]''
    EXEC sp_executesql @ExampleQuery;'

SELECT * FROM #tmpTable

DROP TABLE #tmpTable

实际的查询更复杂,它使用 PIVOT 和其他命令,但我认为如果有人知道如何获得想要的结果,这个例子就足够了。

【问题讨论】:

  • 如果你的问题是#TempTable被清空了,难道##TempTable也不起作用?
  • @Stephen 我试过了,但它给了我这个错误:There is already an object named '##tmpTable' in the database.
  • 因为您要先创建#temptable,所以您需要在SELECT 语句之前使用INSERT INTO #TempTable
  • 我不能,因为它会给出错误Invalid object name '##tmpTable

标签: sql-server sp-executesql global-temp-tables sp-msforeachdb


【解决方案1】:
CREATE TABLE [dbo].#tmpTable ([DbName] VARCHAR(MAX))

EXECUTE sp_MSForEachDB 
    'USE ?;     
    DECLARE @ExampleQuery AS NVARCHAR(MAX) = 
             ''INSERT INTO #tmpTable SELECT DB_NAME() AS [DbName] ''
    EXEC sp_executesql @ExampleQuery;'

SELECT * FROM #tmpTable
DROP TABLE #tmpTable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-18
    • 2020-06-24
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多