2012-10-19 206 views
2

我正在使用SQL Server 2008和SSMS 2012.我有一个存储过程引用一个不存在的表。编辑器在违规表上显示红色下划线以表明有问题。SQL Server:存储过程存储错误

然而,当我执行查询,我得到的消息成功完成

指令(S)。

这是非常讨厌的。我也连接到另一台机器的引擎,它遇到了同样的问题,这意味着它在服务器上,而不是ssms。数据库中是否存在某种设置来确定数据库是否检查存储过程的语法?请帮忙!

澄清: 我知道语法是错误的。问题在于,即使SSMS引用了一个不存在的表,SSMS也允许我执行CREATE或ALTER语句而不会出错。我希望它失败。通常它会,但由于某种原因,它突然停止发出错误。我想让它给我错误。我该怎么做呢?

+1

长话短说,你不能。 [这个问题](http://stackoverflow.com/questions/8713129/sql-server-avoid-deferred-compilation)涵盖了同样的问题。 – Pondlife

+0

我编写了一个脚本来尝试编译存储过程,并提醒我们是否有数据库更改打破了其中的任何一个,并且我发现它有时会提醒我们并且有时仍会编译。最奇怪的是,我们有一个存储过程不止一次地引用了一个删除的表,并且当试图编译时,它在一个引用上抛出一个错误,然而在修复了一个它没有错误编译的引用之后,即使这个EXACT同一张表在存储过程的其他部分被引用! 根据您的经验,您有任何见解吗? – Shock

回答

0

发生什么事是管理工作室中的IDE没有刷新模式模型。由于SSMS的本地实例不知道该表存在,它会在表名称下引发红线;当您真正运行sproc/query时,发送到数据库的代码将正确评估并运行。

刷新SSMS本地数据,尝试按Ctrl-Shift-R,如所描述here.

编辑:

你可能要考虑Deferred Name Resolution

+0

我认为你误会了我。我知道表不存在,编辑器给我红色下划线,但它仍然允许我执行ALTER或CREATE语句而不出错,从而向数据库提交一个无效的存储过程。 Ctrl + Shift + R不会改变这一点。 – mtmurdock

+2

啊,我的不好。您可能需要查看延迟名称解析:http://msdn.microsoft.com/en-us/library/ms190686(v=sql.105).aspx – lyrisey

+0

好吧,是的,这正是我的问题。所以没有办法改变这种行为? – mtmurdock

2

你的语法是罚款和被检查时,您创建存储过程。然而,直到存储过程被编译并且执行存储过程时才会检查表的存在。

+1

这不是事实,我曾经得到错误,说“那个对象不存在”。 – mtmurdock

+1

我已经在SQL Server 2000,2005,2008,2012上测试过了。行为是一样的。我总是可以创建存储过程,但是当我尝试执行存储过程时出现错误。 –

+2

我相信你。但是,我曾经得到错误,我喜欢他们。我想让他们回来。这对我来说是一个非常有用的调试工具。 – mtmurdock