如果 mssql 中存在,为什么内部没有对 ddl 语句进行语义检查



为什么这个(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

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

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

这两种情况在 SQL Server 执行编译的方式上是不同的。

您可以在此链接中阅读有关"延迟名称解析"的更多信息:

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

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

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

最新更新