当前位置: 代码迷 >> Sql Server >> 查询分析器执行2段脚本是顺序执行么?解决办法
  详细解决方案

查询分析器执行2段脚本是顺序执行么?解决办法

热度:8   发布时间:2016-04-27 16:37:43.0
查询分析器执行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   [email protected]
Set   @[email protected]+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 [email protected]
Set @[email protected]+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 [email protected]
Set @[email protected]+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 [email protected]
Set @[email protected]+1

END


go

Alter table TableA Drop column tmpid

------解决方案--------------------
GO 用信号通知 Microsoft&reg; SQL Server&#8482; 实用工具一批 Transact-SQL 语句的结束。
注释 GO 不是 Transact-SQL 语句;
而是可为 osql 和 isql 实用工具及 SQL Server 查询分析器识别的命令。
------解决方案--------------------
是这样的,在DML与DDL语言的操作之间要用go语句来实现.


首先要说明的是:不是执行顺序的问题,sql是按照顺序来执行的.

其次让我来给你解释为什么为提示这样的错误.
在你运行修改表的语句,如果加上go语句,上面的这修改表的语句就是当作一个批处理来执行,而后面的语句就是另外一个批处理,引擎会先执行上面的,在执行下面的.所以第一句前面加上go,不会有错误.但是如果你没有加上go语句,引擎就把你整个查询窗口当作是一个批处理,引擎先会对你整个批处理进行操作之前语法的检查,此时你的修改表的语句还没有执行,而她会检查到你的查询语句中的tempid不在表里头,这样他当然会提示错误了.

所以我们如果在执行DDL语句的时候,最好后面加个go,
  相关解决方案