为什么Microsoft SQL Server检查列而不是存储过程中的表?

Jez*_*Jez 18 sql t-sql sql-server

Microsoft SQL Server似乎在定义存储过程时检查列名有效性,但不检查表名有效性.如果它检测到当前存在引用的表名,则它会根据该表中的列验证语句中的列名.因此,例如,这将运行正常:

CREATE PROCEDURE [dbo].[MyProcedure]
AS
BEGIN
    SELECT
        Col1, Col2, Col3
    FROM
        NonExistentTable
END
GO
Run Code Online (Sandbox Code Playgroud)

......就像这样:

CREATE PROCEDURE [dbo].[MyProcedure]
AS
BEGIN
    SELECT
        ExistentCol1, ExistentCol2, ExistentCol3
    FROM
        ExistentTable
END
GO
Run Code Online (Sandbox Code Playgroud)

...但是由于"列名无效"而失败:

CREATE PROCEDURE [dbo].[MyProcedure]
AS
BEGIN
    SELECT
        NonExistentCol1, NonExistentCol2, NonExistentCol3
    FROM
        ExistentTable
END
GO
Run Code Online (Sandbox Code Playgroud)

为什么SQL Server检查列而不是表?肯定是不一致的; 它应该做两件事,或两者都不做.我们能够定义可能引用模式中不存在的表和/或列的SP是有用的,那么有没有办法关闭SQL Server检查当前存在的表中的列存在

Mar*_*ith 24

这称为延迟名称解析.

没有办法把它关掉.您可以使用动态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
Run Code Online (Sandbox Code Playgroud)