1

在开发和测试新版本时,我喜欢定期运行测试,检查某些存储过程中的引用是否仍然有效,并且无需执行 SP(执行它们需要几个小时。)

(用“with SCHEMABINDING”创建 SP:s 并不是一个明智的选择,因为其他开发人员,对 SP:s 不太了解的开发人员,必须能够对表进行更改。)

问题 #1: 我一直在考虑使用“设置 NOEXEC”。它在检测缺失列时似乎有效,但只要语句不在存储过程中?

这有效

  SET NOEXEC ON  
  select column, MissingCol from mytable
  SET NOEXEC OFF

但这也不是

  SET NOEXEC ON  
  EXEC mySP1
  SET NOEXEC OFF 

也不是这个

  create procedure mySP2
    as
  SET NOEXEC ON  
  select column, MissingCol from mytable
  SET NOEXEC OFF
  go

  EXEC mySP2

接缝工作。这个怎么可能?有什么遗漏吗?你知道更好的方法吗?

问题 #2: 使用 NOEXEC ON 执行不适用于缺少表或错误的表名。SQL Server 的延迟名称解析功能据说是造成这种情况的原因。

但是,似乎可以使用以下代码找到丢失的表(但不是丢失的列):

  select
  object_name(referencing_id) as 'object making reference',
  referenced_class_desc,
  referenced_schema_name,
  referenced_entity_name as 'missing object'
  from sys.sql_expression_dependencies 
  where (select object_id from sys.objects where name = 
  [referenced_entity_name]) is NULL

问题#3: 有没有什么神方法可以以更统一的方式找到丢失的表、丢失的表以及其他问题?

4

0 回答 0