【问题标题】:Let SQL wait until previous statement is done让 SQL 等到上一条语句完成
【发布时间】:2013-12-03 05:30:54
【问题描述】:

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

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

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

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

如果我先运行 rename 和 add 语句,然后分开 update 语句,它确实有效。所以这与一些等待时间有关。

是否可以让sql强制一步一步执行,等到完整的语句执行完再进行下一条?

【问题讨论】:

  • 我不推荐它(或您解决问题的方法),但如果您构建一个动态 SQL 块并在修改您的架构的语句之后执行它 - 代码将根据修改后的架构进行评估

标签: sql-server tsql transactions


【解决方案1】:

如果您修改列(例如添加它们),您必须先完成批处理,然后才能继续更新它们。在表结构更改和更新之间插入 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')

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

【讨论】:

  • 如果你使用 GO 语句,我的变量会丢失,我还会在交易中做一些其他的事情。此外,GO 语句仅适用于“GO 不是 T-SQL 命令。是批处理分隔符。客户端工具(SSM、sqlcmd、osql 等)使用它来有效地在每个 GO 处剪切文件并将个人发送到服务器批次。所以显然你不能在 IF 中使用 GO,也不能期望变量跨越批次的范围。”
【解决方案2】:

这与等待时间无关。查询按顺序运行。这是因为所有查询都是一次提交的,因此当它尝试验证您的更新时,该列在该时间点不存在。为了解决这个问题,您需要分批发送更新。在你的 alter 和 update 语句之间需要添加以下关键字

GO

【讨论】:

    【解决方案3】:

    您可以尝试使用 select 进行更新,

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

    这将确保您的查询将等待锁定,位建议指定 WAIT 以指示数据库等待整数秒,这样它就不会等待不确定的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 2018-09-26
      相关资源
      最近更新 更多