我遇到的sql脚本似乎与语句的执行顺序有关,或者可能只是在启动之前sql server执行的错误检查。
这是代码的简化,但对于后台,表finalTable被此脚本清除并重新填充。它已存在于DB中,但没有添加新列。作为示例中的参考,假装Col1是现有列而Col2是新列。
如果我一起运行代码,我会收到一条消息,指出无效的列名称' Col2'。如果我单独运行每个块,一切正常。
A座:
SQL to create temporary tables
B座:
drop table dbo.finalTable;
create table dbo.finalTable (col1 int, col2 int);
C座:
insert into dbo.finalTable(col1, col2) select col1, col2 from #tempTable;
答案 0 :(得分:1)
您发布的脚本片段不够详细,无法确定错误的确切原因,但症状显示deferred name resolution。问题不是语句执行顺序而是编译顺序。
当提交一批语句执行时,SQL Server会检查语法错误。如果语法正确,则引用现有对象的语句将根据现有模式进行验证。引用不存在的对象的语句的编译推迟到执行时间。延迟名称解析允许用户创建一个表并在同一批次中使用它:
CREATE TABLE dbo.finalTable (col1 int);
--Compilation of this statement is not done until execution time due to deferred name resolution
SELECT col1 FROM dbo.finaltable;
GO
当语句引用现有表的不存在列时,整个批处理的编译将失败。在批处理中不执行任何语句,包括第一个SELECT
ALTER TABLE
,因为编译批处理时col2不存在:
SELECT col1 FROM dbo.finaltable;
ALTER TABLE dbo.finaltable
ADD col2 int NULL;
SELECT col1, col2 FROM dbo.finaltable;
GO
答案 1 :(得分:0)
当您执行整个脚本时,脚本执行和finalTable是否是同一个数据库?你可以尝试
IF OBJECT_ID('databasename.dbo.finalTable', 'U') IS NOT NULL
DROP TABLE databasename.dbo.finalTable;