为什么在mssql中存在ddl语句内部没有语义检查?

时间:2017-06-22 01:57:28

标签: sql sql-server

为什么这个(ddl)没有编译错误?


IF EXISTS(SELECT * FROM sys.columns WHERE OBJECT_ID('[dbo].[TableDoesNotExits]') = object_id) 
BEGIN 
    ALTER TABLE  [dbo].[TableDoesNotExits] ADD RandomColumn INT --Works fine
END

虽然这个(dml)没有? 提供查询注释中提到的编译错误 包装在动态查询中时工作? (使用sp_executesql)


IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TableExists' AND COLUMN_NAME = 'ColumnDoesNotExists')
BEGIN
    UPDATE 
        dbo.TableExists
    SET 
        ColumnDoesNotExists = 1 --Invalid column name 'ColumnDoesNotExists'
    WHERE 
        1 = 1
END

1 个答案:

答案 0 :(得分:2)

在您的第一个示例中,您正在引用一个不存在的表。

在第二个示例中,您引用现有表中不存在的列。

这两种情况在SQL Server执行编译方面有所不同。

您可以在此链接中详细了解“延期名称解析”:

https://technet.microsoft.com/en-us/library/ms190686(v=sql.105).aspx

我在这里引用最相关的段落:

  

延迟名称解析只能在引用不存在的表对象时使用。创建存储过程时,所有其他对象必须存在。例如,当您引用存储过程中的现有表时,无法列出该表的不存在的列。