为什么这个(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
答案 0 :(得分:2)
在您的第一个示例中,您正在引用一个不存在的表。
在第二个示例中,您引用现有表中不存在的列。
这两种情况在SQL Server执行编译方面有所不同。
您可以在此链接中详细了解“延期名称解析”:
https://technet.microsoft.com/en-us/library/ms190686(v=sql.105).aspx
我在这里引用最相关的段落:
延迟名称解析只能在引用不存在的表对象时使用。创建存储过程时,所有其他对象必须存在。例如,当您引用存储过程中的现有表时,无法列出该表的不存在的列。