Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 如何检查是否存在使用表的视图_Sql_Database_Sql Server 2008_Ssms - Fatal编程技术网

Sql 如何检查是否存在使用表的视图

Sql 如何检查是否存在使用表的视图,sql,database,sql-server-2008,ssms,Sql,Database,Sql Server 2008,Ssms,是否可以使用SQLServerManagementStudio检查表是否是相同或不同数据库中视图的一部分 如果可以通过一些插件来完成,那也可以。对于相同的数据库,您可以检查该表的依赖项,并查看其他对象使用它 EXEC sp_depends @objname = N'your_table_name' ; 像这样: SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE WHERE TABLE_SCHEMA = 'dbo' --(or

是否可以使用SQLServerManagementStudio检查表是否是相同或不同数据库中视图的一部分


如果可以通过一些插件来完成,那也可以。

对于相同的数据库,您可以检查该表的依赖项,并查看其他对象使用它

EXEC sp_depends @objname = N'your_table_name' ;
像这样:

SELECT  *
FROM    INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE   TABLE_SCHEMA = 'dbo'    --(or whatever your Schema name is)
  AND   TABLE_NAME   = 'YourTableName'
应适用于任何符合ISO SQL的数据库,而不仅仅是SQL Server

请注意,跨数据库依赖关系是另一回事。理论上,它们应该出现在这里,但是在实践中,这可能不一致,因为当涉及到跨数据库引用时,SQL Server确实允许延迟解析,即使对于视图也是如此

SELECT QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([object_id]))
  FROM sys.sql_dependencies
  WHERE referenced_major_id = OBJECT_ID(N'dbo.your_table_name');
或:

然而,请注意,其中一些方法,包括
sp_dependens
INFORMATION_SCHEMA
sysdependens
等,都容易失步。更多信息请点击此处:

一个简单的例子:

CREATE TABLE dbo.table1(id INT);
GO
CREATE VIEW dbo.view1 
AS
  SELECT id FROM dbo.table1;
GO

SELECT QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([object_id]))
  FROM sys.sql_dependencies
  WHERE referenced_major_id = OBJECT_ID('dbo.table1');

-- returns 1 row

GO    
DROP TABLE dbo.table1;
GO
CREATE TABLE dbo.table1(id INT);
GO

SELECT QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([object_id]))
  FROM sys.sql_dependencies
  WHERE referenced_major_id = OBJECT_ID('dbo.table1');

-- returns 0 rows!!!!
如果执行以下操作,它将再次返回行:

EXEC sp_refreshsqlmodule N'dbo.view1';
但是,谁希望每次检查元数据时都刷新系统中的每个视图呢

因此,您可能希望将此方法与对所有视图的文本进行暴力解析相结合:

SELECT name FROM sys.views
  WHERE OBJECT_DEFINITION([object_id])
  LIKE N'%your_table_name%';
根据表名的不同,这可能会出现一些误报,但这可能是一个很好的交叉检查

为了避免此类问题,我尝试养成了使用SCHEMABINDING创建视图的习惯(或者尽量避免视图)。当然,当您需要以不影响视图的方式更改表时,这可能会成为一件痛苦的事情,但无论如何都应该认真对待表的更改

SELECT name FROM sys.views
  WHERE OBJECT_DEFINITION([object_id])
  LIKE N'%your_table_name%';