【发布时间】:2016-03-03 12:51:45
【问题描述】:
我的存储过程结构如下图,报错
关键字“BEGIN”附近的语法不正确。
如果我删除 BEGIN TRAN 和 COMMIT 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 TRAN和COMMIT 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