在开发和测试新版本时,我喜欢定期运行测试,检查某些存储过程中的引用是否仍然有效,并且无需执行 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: 有没有什么神方法可以以更统一的方式找到丢失的表、丢失的表以及其他问题?