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

时间:2013-01-30 22:49:12

标签: sql database sql-server-2008 ssms

是否可以使用SQL Server Management Studio检查表是否属于相同或不同数据库中的视图的一部分?

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

3 个答案:

答案 0 :(得分:5)

像这样:

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确实允许延迟解析,即使对于Views也是如此。

答案 1 :(得分:2)

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');

或者:

SELECT referencing_schema_name, referencing_entity_name
  FROM sys.dm_sql_referencing_entities(N'dbo.your_table_name', N'OBJECT');

但请注意,其中一些方法(包括sp_dependsINFORMATION_SCHEMAsysdepends等都容易失去同步。更多信息:

一个简单的例子:

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%';

根据你的桌子名称,这可能会产生一些误报,但这可能是一个很好的交叉检查。

为了避免这种问题,我试图养成创建我的观点WITH SCHEMABINDING的习惯(或者尽可能地避免观看)。当然,当您需要以不影响视图的方式更改表格时,这可能会变得很痛苦,但无论如何都应该认真对待表格。

答案 2 :(得分:1)

对于同一个数据库,您可以检查该表的依赖关系,并查看其他对象使用它。

EXEC sp_depends @objname = N'your_table_name' ;