2011-09-21 109 views
1

我刚刚部署了一个新的存储过程到我们的测试环境,只是为了让它在执行时失败,因为测试系统没有包含存储过程依赖的表。我相信这是由于deferred name resolution是否有解决SQL Server延迟名称解析的方法?

事情是,我觉得有时在过去,我试图创建存储过程,由于缺少依赖关系而失败。但我可能是错的。

无论如何,是否有可能以某种方式强制名称解析创建一个存储过程?如果是这样,是否有任何方法使sqlcmd和SSMS一起工作?

通过这种方式,我们可以了解脚本的首次执行时缺少的依赖性。

在附注上,我有兴趣阅读关于延迟分辨率如何工作的明显deviation from the MSDN doco

编辑:我们混合了2005/2008(不受我控制),所以我需要一个2005解决方案来处理这两个实例。

+1

您可以在投票[连接问题(http://connect.microsoft.com/SQL /feedback/ViewFeedback.aspx?FeedbackID=127152),但似乎没有太多的动作(除了upvotes),并没有列出的解决方法。 –

+0

请说明SQL Server版本 –

+0

在最后一段中,我不确定人们在阅读和理解整个MSDN文档。它没有说它会在启动前发生错误,它说:“如果执行存储过程时由存储过程引用的对象丢失,则存储过程**在到达引用缺失对象的语句时停止执行**“(我的重点) –

回答

4

您可以调查WITH SCHEMABINDING,但由于Damien链接到的连接项目的评论中指出的原因,这可能不适用于您。

如果SQL Server 2008上,你也可以看看sys.sql_expression_dependencies

CREATE PROC bar 
AS 
SELECT * 
FROM DoesNotExist 
JOIN AlsoDoesNotExist ON 1=1 

GO 

CREATE TABLE DoesNotExist 
(
X INT 
) 
GO 

SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name, 
     referenced_entity_name 
FROM sys.sql_expression_dependencies 
WHERE referenced_id IS NULL 

返回

referencing_entity_name  referenced_entity_name 
------------------------------ ------------------------------ 
bar       AlsoDoesNotExist 
+0

感谢您的想法。我明天会看看。 –

+0

我只是做一些关于使用WITH SCHEMABINDING进行程序的研究。从我读过的内容可以看出,SCHEMABINDING目前不适用于存储过程。 Damien发布的链接中的评论似乎表明,如果在将来的某个版本中,SCHEMABINDING作为存储过程的选项提供,那么它可能是不受欢迎的。你会建议程序化的依赖性检查在2005年除了在执行时间之外是不可能的吗? –

+0

除了上面我的评论,似乎MSDN doco for sp_refreshsqlmodule - http://msdn.microsoft.com/en-us/library/bb326754(v=SQL.90).aspx引用“... nonschema-绑定存储过程..“,所以也许我关于SCHEMABINDING存储过程的假设是不正确的。如果是这样,你有关于所需语法的想法吗?我试过了; CREATE PROCEDURE [DBO]。[TGA_SB1] \t WITH SCHEMABINDING AS BEGIN \t SELECT * FROM nothinghere END GO ,但没有奏效。 –