是否可以在 SQL 服务器中的所有数据库中搜索特定视图?如果是如何?
Is it possible to search all databases in a SQL Server for a specific view? If yes how?
我正在尝试寻找特定视图。我知道它存在于特定的 SQL 服务器上,但我不知道在哪个数据库下。如果我使用 Information_Schema 它只会在当前数据库中搜索。
SELECT *
FROM INFORMATION_SCHEMA.Views v
WHERE v.Table_Name LIKE '%vwViewName%'
是否可以在 SQL 服务器实例中的所有数据库中搜索特定视图?如果是,那又如何?
您可以使用 sp_msforeachdb
检查所有数据库的 sys.views
:
DECLARE @views TABLE (ViewName NVARCHAR(4000))
DECLARE @ViewName NVARCHAR(4000) = 'ViewName'
DECLARE @query NVARCHAR(4000) = 'SELECT ''?'' + ''.'' + s.name + ''.'' + v.name from [?].sys.views v inner join sys.schemas s on v.schema_id=s.schema_id WHERE v.name LIKE ''%' + @ViewName + '%'''
INSERT INTO @views (ViewName)
EXEC sp_msforeachdb @query
SELECT *
FROM @views
您可以像这样构建一个列表来搜索每个数据库中的视图
SELECT 'select * from ' + name + '.INFORMATION_SCHEMA.Views v where v.Table_Name like ''%vwViewName%'''
FROM master.dbo.sysdatabases
这将 return 例如这样的结果
select * from master.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from tempdb.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from model.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from msdb.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from Test.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from Prod.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from sysdb.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
然后您可以运行这些查询中的每一个
您可以关闭 tempdb 和其他数据库。
此外,如果您只需要 运行 一个查询,那么使用这样的联合
select table_catalog + '.' + table_schema + '.' + table_name from test.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
union all
select table_catalog + '.' + table_schema + '.' + table_name from prod.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
现在您只有一个 运行 查询,并且仍会获取找到该视图的所有数据库,结果将采用 DBName.dbo.ViewName
格式
如果您需要按名称查找数据库对象(例如表、列、触发器)- 请查看名为 SQL Search 的 FREE Red-Gate 工具这样做 - 它会在您的整个数据库中搜索任何类型的字符串。
对于任何 DBA 或数据库开发人员来说,它都是一个很棒的必备工具 - 我是否已经提到它绝对 免费 用于任何用途?
我正在尝试寻找特定视图。我知道它存在于特定的 SQL 服务器上,但我不知道在哪个数据库下。如果我使用 Information_Schema 它只会在当前数据库中搜索。
SELECT *
FROM INFORMATION_SCHEMA.Views v
WHERE v.Table_Name LIKE '%vwViewName%'
是否可以在 SQL 服务器实例中的所有数据库中搜索特定视图?如果是,那又如何?
您可以使用 sp_msforeachdb
检查所有数据库的 sys.views
:
DECLARE @views TABLE (ViewName NVARCHAR(4000))
DECLARE @ViewName NVARCHAR(4000) = 'ViewName'
DECLARE @query NVARCHAR(4000) = 'SELECT ''?'' + ''.'' + s.name + ''.'' + v.name from [?].sys.views v inner join sys.schemas s on v.schema_id=s.schema_id WHERE v.name LIKE ''%' + @ViewName + '%'''
INSERT INTO @views (ViewName)
EXEC sp_msforeachdb @query
SELECT *
FROM @views
您可以像这样构建一个列表来搜索每个数据库中的视图
SELECT 'select * from ' + name + '.INFORMATION_SCHEMA.Views v where v.Table_Name like ''%vwViewName%'''
FROM master.dbo.sysdatabases
这将 return 例如这样的结果
select * from master.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from tempdb.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from model.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from msdb.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from Test.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from Prod.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
select * from sysdb.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
然后您可以运行这些查询中的每一个
您可以关闭 tempdb 和其他数据库。
此外,如果您只需要 运行 一个查询,那么使用这样的联合
select table_catalog + '.' + table_schema + '.' + table_name from test.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
union all
select table_catalog + '.' + table_schema + '.' + table_name from prod.INFORMATION_SCHEMA.Views v where v.Table_Name like '%vwViewName%'
现在您只有一个 运行 查询,并且仍会获取找到该视图的所有数据库,结果将采用 DBName.dbo.ViewName
如果您需要按名称查找数据库对象(例如表、列、触发器)- 请查看名为 SQL Search 的 FREE Red-Gate 工具这样做 - 它会在您的整个数据库中搜索任何类型的字符串。
对于任何 DBA 或数据库开发人员来说,它都是一个很棒的必备工具 - 我是否已经提到它绝对 免费 用于任何用途?