加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

为什么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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读