Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL-从合并查询筛选器获取数据库名称_Sql Server_Tsql - Fatal编程技术网

Sql server SQL-从合并查询筛选器获取数据库名称

Sql server SQL-从合并查询筛选器获取数据库名称,sql-server,tsql,Sql Server,Tsql,下午好 我有一个工作查询,在这里我循环遍历我的所有数据库,并向下过滤以检查在哪里使用哪个报表。这是可行的(见下文) 我有一个工作问题: 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

下午好

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

我有一个工作问题:

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次,但我不知道在哪里

因此,我想包括使用此报表的数据库名称。 我在谷歌上搜索了一下,尝试了很多东西,但都没能成功


有什么想法吗?

只要对你已有的东西稍加调整,你就能达到目的

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 

您的意思是要获取这些报表中使用的源查询所引用的所有数据库?您使用的是
quotename(name)
中的名称。您可能可以将动态查询更改为
选择名称、路径……
,以获取所需内容。此外,通过将
%
s放置在
的两侧,如
过滤器,您可以排除该列上的任何索引。如果所有报告都以该文本开头,请删除第一个通配符
%
。它应该会加快查询速度。您需要将
[name]
用单引号括起来,然后可能会在那里抛出一个
作为DatabaseName
别名。但是,是的,就像这样。@EricBrandt,如果他们用引号将[name]括起来,基本上会在查询中使用这些措辞,而不是实际的数据库名称。正确的?select from sys.Database不在执行内容的上下文中。他们正在使用sys.database生成查询。对不起。我当时不太清楚。在动态SQL部分中,它应该是
'SELECT'+[name]+''作为DatabaseName,path FROM'
,这样数据库的名称被物化查询视为字符串而不是对象标识符。假设我正确地描绘了输出。今天早上我还没打到1000分,所以请相信我。