让SQL等到上一个语句完成

时间:2013-12-03 05:30:54

标签: sql-server tsql transactions

我一直在寻找,但我找不到正确的答案,可能我搜索错了,因为我不知道该找什么:)

无论如何,我有一个带有begincommit transaction的TSQL。在事务中,我添加了一些列,并重命名了一些列。 在重命名和添加列语句之后,我还运行一些更新语句以将数据加载到新创建的列中。

现在的问题是,由于某种原因,更新会产生一个错误,它无法更新给定的列,因为它不存在(YET ???)。

我的想法是该语句仍在计算重命名和添加列,但已经继续使用更新语句。该表非常大,有几百万条记录,所以我可以想象它需要一些时间来添加和重命名列

如果我首先运行重命名并添加语句而不是单独更新语句,它确实有效。所以它与一些等待时间有关。

是否有可能让sql force逐步执行并等到完成语句完成后再转到下一个?

3 个答案:

答案 0 :(得分:6)

如果修改列(例如添加它们),则必须先完成批处理才能继续更新它们。在表结构更改和更新之间插入GO关键字。

为了说明这一点,以下代码将不起作用:

create table sometable(col1 int)

go

alter table sometable add col2 varchar(10)

insert into sometable(col2) values ('a')

但插入go会使插图识别新列

create table sometable(col1 int)

go

alter table sometable add col2 varchar(10)

go

insert into sometable(col2) values ('a')

如果您在代码中执行此操作,则可能需要为结构更改和数据迁移创建单独的事务。您仍然可以将它们包装在一个事务中以保证数据的完整性。

答案 1 :(得分:2)

它与等待时间没有任何关系。查询按顺序运行。这是因为所有查询都是一次性提交的,因此当它尝试验证您的更新时,该列在该时间点不存在。要绕过它,您需要在单独的批处理中发送更新。需要在alter和update语句

之间添加以下关键字
GO

答案 2 :(得分:-1)

您可以尝试使用select for update,

http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2130052

这将确保您的查询将等待锁定,建议使用“指定WAIT”来指示数据库等待整数秒,以便它不会等待不确定的时间。