Microsoft sql Server似乎在定义存储过程时检查列名的有效性,但不是表名有效.如果它检测到目前存在引用的表名,则会根据该表中的列来验证一个语句中的列名.所以,例如,这将运行OK:
CREATE PROCEDURE [dbo].[MyProcedure] AS BEGIN SELECT Col1,Col2,Col3 FROM NonExistentTable END GO
…这将是:
CREATE PROCEDURE [dbo].[MyProcedure] AS BEGIN SELECT ExistentCol1,ExistentCol2,ExistentCol3 FROM ExistentTable END GO
…但这失败了,列“名称无效”:
CREATE PROCEDURE [dbo].[MyProcedure] AS BEGIN SELECT NonExistentCol1,NonExistentCol2,NonExistentCol3 FROM ExistentTable END GO
为什么sql Server检查列而不是表存在?当然是不一致的它应该做两个,或者两者都不应该.对于我们来说,能够定义可能引用模式中不存在的表AND / OR列的SP是有用的,那么有没有办法关闭sql Server检查当前存在的表中的列存在?
这被称为延迟名称解析.
没有办法把它关掉.您可以使用动态sql或(一个讨厌的黑客!)添加对不存在的表的引用,以便延迟该语句的编译.
CREATE PROCEDURE [dbo].[MyProcedure] AS BEGIN CREATE TABLE #Dummy (c int) SELECT NonExistantCol1,NonExistantCol2,NonExistantCol3 FROM ExistantTable WHERE NOT EXISTS(SELECT * FROM #Dummy) DROP TABLE #Dummy END GO
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。