查询分析器执行2段脚本是顺序执行么?
用mssql2000,查询分析器;
下面几段脚本,是用来临时处理数据用的,发现第一句Alter ........生成tmpid字段的语句和后面的语句一同选中执行,就提示出错,列名tmpid无效;单独选中执行一下,再执行后面的sql脚本,就没事儿,不明所以,请教一下。好像查询分析器是在并发执行第一条和后面几条语句?
Alter table TableA Add tmpid bigint IDENTITY (1, 1) NOT NULL
Declare @Count Bigint
Declare @BillRowID varchar(50)
Select @Count=MIN(tmpid) From TableA
While (@Count <=(Select Max(tmpid) From TableA))
Begin
Update TableA Set Modification_Num=Modification_Num+1 Where tmpid=@Count
Set @Count=@Count+1
END
Print @Count
Alter table TableA Drop column tmpid
------解决方案----------------------alter 语句后加go即可,如下:
Alter table TableA Add tmpid bigint IDENTITY (1, 1) NOT NULL
go
Declare @Count Bigint
Declare @BillRowID varchar(50)
Select @Count=MIN(tmpid) From TableA
While (@Count <=(Select Max(tmpid) From TableA))
Begin
Update TableA Set Modification_Num=Modification_Num+1 Where tmpid=@Count
Set @Count=@Count+1
END
Print @Count
Alter table TableA Drop column tmpid
go
------解决方案----------------------如果在存储过程中执行,需要用动态SQL来添加或drop列,如下:
--因为存储过程中间的代码不能带go。
declare @sql varchar(1000)
set @sql= 'Alter table TableA Add tmpid bigint IDENTITY (1, 1) NOT NULL '
exec (@sql)
Declare @Count Bigint
Declare @BillRowID varchar(50)
Select @Count=MIN(tmpid) From TableA
While (@Count <=(Select Max(tmpid) From TableA))
Begin
Update TableA Set Modification_Num=Modification_Num+1 Where tmpid=@Count
Set @Count=@Count+1
END
Print @Count
set @sql = 'Alter table TableA Drop column tmpid '
exec (@sql)
go
------解决方案--------------------加一个go就行了
create table TableA(name varchar(20))
insert TableA select 'aaa '
insert TableA select 'bbb '
insert TableA select 'ccc '
drop table TableA
Alter table TableA Add tmpid bigint IDENTITY (1, 1) NOT NULL
go
Declare @Count Bigint
Declare @BillRowID varchar(50)
Select @Count=MIN(tmpid) From TableA
While (@Count <=(Select Max(tmpid) From TableA))
Begin
print @Count
--Update TableA Set Modification_Num=Modification_Num+1 Where tmpid=@Count
Set @Count=@Count+1
END
go
Alter table TableA Drop column tmpid
------解决方案--------------------GO 用信号通知 Microsoft® SQL Server™ 实用工具一批 Transact-SQL 语句的结束。
注释 GO 不是 Transact-SQL 语句;
而是可为 osql 和 isql 实用工具及 SQL Server 查询分析器识别的命令。
------解决方案--------------------是这样的,在DML与DDL语言的操作之间要用go语句来实现.
首先要说明的是:不是执行顺序的问题,sql是按照顺序来执行的.
其次让我来给你解释为什么为提示这样的错误.
在你运行修改表的语句,如果加上go语句,上面的这修改表的语句就是当作一个批处理来执行,而后面的语句就是另外一个批处理,引擎会先执行上面的,在执行下面的.所以第一句前面加上go,不会有错误.但是如果你没有加上go语句,引擎就把你整个查询窗口当作是一个批处理,引擎先会对你整个批处理进行操作之前语法的检查,此时你的修改表的语句还没有执行,而她会检查到你的查询语句中的tempid不在表里头,这样他当然会提示错误了.
所以我们如果在执行DDL语句的时候,最好后面加个go,