【问题标题】:Use of Begin tran in a stored procedure which include update statements and a CTE在包含更新语句和 CTE 的存储过程中使用 Begin tran
【发布时间】:2016-03-03 12:51:45
【问题描述】:

我的存储过程结构如下图,报错

关键字“BEGIN”附近的语法不正确。

如果我删除 BEGIN TRANCOMMIT TRAN 语句,则存储过程运行良好。我不确定我做错了什么。任何人都可以帮助我了解什么是错误的,什么应该是正确的方法?

Create PROCEDURE proc_name(param1,param2,param3)
AS
Begin
with cte(col1, col2, col3)
AS
(
Select col1
,col2
,col3
from table1
)
Begin Tran
Update table2
set col1 = 'text'
from table2 inner join cte on cte.hmy = table2.hmy
where some condition

update table3
set date = ''
from table3 inner join cte on cte.hmy = table3.hmy
where some different condition

COMMIT TRAN

END

附言请忽略查询逻辑。我试图通过删除业务逻辑来简化代码。

【问题讨论】:

  • 刚刚试过了。还是一样的错误。
  • 您不能将BEGIN TRAN 放在CTE 的中间,只需用BEGIN TRANCOMMIT TRAN 包围CTE。
  • @Lankymart 我在 CTE 完成后放置了 begin tran。有错吗?
  • 这取决于你想要做什么。如果您只想实现第一次更新,那么您可以将BEGIN TRAN 放在WITH 之前,将COMMIT TRAN 放在第一个UPDATE 语句(因为这是CTE 的一部分) 之后。否则,只需将 CTE 和第二个 UPDATE 包装在 BEGIN TRAN ... COMMIT TRAN 语句中。

标签: sql-server sql-server-2012 sql-server-2014


【解决方案1】:

BEGIN TRAN不能在 CTE 的中间,请将事务移到 CTE 之外。

CREATE PROCEDURE proc_name(param1,param2,param3)
AS
BEGIN
  BEGIN TRAN

    ;WITH cte(col1, col2, col3)
    AS
    (
      SELECT col1
      ,col2
      ,col3
      FROM table1
    )
    UPDATE table2
    SET col1 = 'text'
    FROM table2 INNER JOIN cte ON cte.hmy = table2.hmy
    WHERE some condition

    UPDATE table3
    SET date = ''
    FROM table3 INNER JOIN cte ON cte.hmy = table3.hmy
    WHERE some different condition

  COMMIT TRAN
END

您也可以合法地将交易仅应用于 CTE,但第二个 UPDATE 不会包含在交易中。

CREATE PROCEDURE proc_name(param1,param2,param3)
AS
BEGIN
  BEGIN TRAN

    ;WITH cte(col1, col2, col3)
    AS
    (
      SELECT col1
      ,col2
      ,col3
      FROM table1
    )
    UPDATE table2
    SET col1 = 'text'
    FROM table2 INNER JOIN cte ON cte.hmy = table2.hmy
    WHERE some condition

  COMMIT TRAN

  -- UPDATE will run but not part of the transaction.
  UPDATE table3
  SET date = ''
  FROM table3 INNER JOIN cte ON cte.hmy = table3.hmy
  WHERE some different condition
END

【讨论】:

  • 工作就像一个魅力!非常感谢。等待 4 分钟将其标记为解决方案 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多