2017-04-07 39 views
0

我遇到了一个似乎与声明的执行顺序有关的sql脚本的问题,或者可能只是在启动之前检查sql server是否有错误。声明SQL Server SQL脚本中的执行顺序

这是对代码的简化,但对于后台,表格finalTable被清除并由此脚本重新填充。它已经存在于数据库中,但没有添加新列。为了在示例中参考,假装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

作为附加的注释:没有陈述,包括第一SELECTALTER TABLE,在此批执行,因为COL2不存在在批量编译没有新列,仍然有旧数据。如果我在该会话中查询tempTable,它具有正确的当前数据。 – MeteorMan

+0

显示您的整个脚本。 – mallan1121

+0

我喜欢但它是1800行,包含专有信息。 – MeteorMan

回答

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 

整批编译失败。收到的无效列名消息之后,如果我查询finalTable,它 -

SELECT col1 FROM dbo.finaltable; 
ALTER TABLE dbo.finaltable 
    ADD col2 int NULL; 
SELECT col1, col2 FROM dbo.finaltable; 
GO 
0

是不是同一个数据库的脚本执行,当你执行finalTable存在脚本整体?您可以尝试

IF OBJECT_ID('databasename.dbo.finalTable', 'U') IS NOT NULL 
     DROP TABLE databasename.dbo.finalTable;