为什么MS Sql Server(2005和2008;其他地方未经测试)如果表中不存在列,如果表不存在则会引发错误,则会引发错误?
更具体地说,我有以下架构(高度减少以显示一切重要):
CREATE TABLE table1 (
id int identity(1,1) primary key
)
为什么以下查询失败并显示错误Invalid column name 'iDoNotExist'.
?
if 1=2
begin
print 'table that shouldn''t exist does'
select * from [IDoNotExist]
end
if 1=2
begin
print 'column that shouldn''t exist does'
select iDoNotExist from table1
end
我希望它可能会因多个错误而失败(如果它实际编译并注意到表和列不在那里)或者没有错误(如果它忽略了if语句的内容,因为它们是不打算跑。)我该怎么做才能让它无误地运行?
PS实际查询在if语句中有这个但是它没有任何区别:
exists (select * from [INFORMATION_SCHEMA].[COLUMNS] t where t.[TABLE_NAME] = 'table1' and t.[COLUMN_NAME] = 'iDoNotExist')
答案 0 :(得分:7)
您正在看到deferred name resolution对表的影响。
答案 1 :(得分:2)
RE:
我该怎么做才能让它无误地运行?
使用EXEC
以便语句在未编译的子批处理中运行,除非采用IF
分支。
IF 1 = 2
BEGIN
PRINT 'column that shouldn''t exist does'
EXEC ('SELECT iDoNotExist FROM table1')
END
另一个理论上的可能性是通过在另一个非现有表中添加No-Op引用来推迟编译违规语句。
IF 1 = 2
BEGIN
PRINT 'column that shouldn''t exist does'
CREATE TABLE #T(X INT)
SELECT iDoNotExist
FROM table1, (SELECT MAX(X) X FROM #T) T
DROP TABLE #T
END
无法想象任何优先考虑EXEC
的情况。