为什么Microsoft SQL Server检查存储过程中的列而不是表?
发布时间:2020-12-14 01:41:37 所属栏目:Windows 来源:网络整理
导读:Microsoft SQL Server似乎在定义存储过程时检查列名的有效性,但不是表名有效.如果它检测到目前存在引用的表名,则会根据该表中的列来验证一个语句中的列名.所以,例如,这将运行OK: CREATE PROCEDURE [dbo].[MyProcedure]ASBEGIN SELECT Col1,Col2,Col3 FROM N
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- windows-phone-7 – 当应用程序暂停时,对AudioPlayerAgent中
- winrt-xaml – 为什么我不能让按钮的宽度变小?
- windows版mysql添加远程访问
- 在Ansible中,如何连接到Windows主机?
- 免费的.NET Windows控件库?
- XP / Vista上的数字签名时间戳“不可用”,导致验证失败
- windows-server-2008-r2 – 为什么我的Server 2008 R2 DC上
- user-interface – 调整大小时Win32 GUI闪烁
- windows – WSUS和Pulled Patches
- windows-server-2008-r2 – Win2008R2:暴力攻击预防
推荐文章
站长推荐
- wpf – 如何从字节数组创建System.Windows.Media
- windows-server-2008-r2 – Windows Server 2008
- 卸载/升级时的Wix停止服务:防止“重启弹出”(文
- windows-server-2008-r2 – Win2k8R2获取DHCPv6地
- windows – 为什么故障转移而不是HA的负载平衡
- Windows – 在服务器2008 R2上关闭没有足够的时间
- azure-active-directory – 如何从graph.microso
- windows-server-2008-r2 – 我在哪里授予权限,以
- 从我的Windows10到我的docker容器中找到我的ssh密
- Windows – Visual Studio 2015慢
热点阅读