首页 > 解决方案 > SQL - 从合并查询过滤器中获取数据库名称

问题描述

下午好,

我有一个工作查询,我在其中循环遍历所有数据库,并向下过滤以检查哪个报告在哪里使用。这有效(见下文)

我有这个工作查询:

SET NOCOUNT ON;

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

CREATE TABLE #temp
(
      ReportPath VARCHAR(500)
      )

declare @SQL nvarchar(max)

set @SQL = STUFF((SELECT '

UNION ALL
' + 'SELECT path FROM ' + quotename(name) + '.dbo.ReportConfig where path like ''%/Standard Reports/Booking/Booked Out by Location%'' and Active = 1'
from sys.Databases 
WHERE name LIKE 'SFB-%' 
FOR XML PATH(''), type).value('.','varchar(max)'),1,15,'')

INSERT #temp
execute(@SQL)

SELECT  ReportPath FROM #temp 

这给了我以下输出:

在此处输入图像描述

所以我知道在我的 90 个数据库中,该报告被使用了 6 次,但我不知道在哪里。

所以我想包括使用此报告的数据库名称。我用谷歌搜索并尝试了很多东西,但我无法让它工作。

有任何想法吗?

标签: sql-servertsql

解决方案


只需对您已有的东西进行一点小小的调整,您就可以到达那里

SET NOCOUNT ON;

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

--Add a column to your temp table
CREATE TABLE #temp
(
      DatabaseName varchar(100)
      ,ReportPath VARCHAR(500)
      )

declare @SQL nvarchar(max)

--adjust your dynamic query and add the [name] column as shown below
set @SQL = STUFF((SELECT '

UNION ALL
' + 'SELECT ''' + [name] + ''' as DatabaseName,path FROM ' + quotename(name) + '.dbo.ReportConfig where path like ''%/Standard Reports/Booking/Booked Out by Location%'' and Active = 1'
from sys.Databases 
WHERE name LIKE 'SFB-%' 
FOR XML PATH(''), type).value('.','varchar(max)'),1,15,'')

INSERT #temp
execute(@SQL)

SELECT  DatabaseName, ReportPath FROM #temp 

推荐阅读