【问题标题】:Incorrect syntax near the keyword `End` in stored procedure存储过程中关键字“End”附近的语法不正确
【发布时间】:2015-06-12 23:27:13
【问题描述】:

当我尝试执行以下存储过程时,会出现此错误

消息 156,级别 15,状态 1,过程 TT_SP_UpdateTask,第 43 行
关键字“end”附近的语法不正确。

End指的是end在下面的过程中靠近if (@Status = 'Developing')。

我反复检查begins 和ends 的顺序,但找不到错误原因。

这是我的存储过程。

ALTER PROCEDURE [dbo].[TT_SP_UpdateTask]

@EstimateTime decimal(18,2),
@Status varchar(10),
@TaskAssignId varchar(30),
@IsDone bit

AS

BEGIN
if(@IsDone = 1)
begin
   UPDATE [TT_TaskAssign]
      SET 
        DevFinish = getdate(),
        Status = @Status,
        IsDone = @IsDone
      WHERE AssignID = @TaskAssignId

   UPDATE dbo.TT_TaskAsignKPI
     SET 
       actTime = (select convert(varchar(5),DateDiff(s, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), getdate())/3600)+':'+convert(varchar(5),DateDiff(s, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), getdate())%3600/60)+':'+convert(varchar(5),(DateDiff(s, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), getdate())%60)) as [hh:mm:ss], 
       actTimeNum= (SELECT DATEDIFF(SECOND, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), GETDATE()) AS SecondDiff, 
       KPINum= (SELECT DATEDIFF(SECOND,(SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE()) AS SecondsKPI,
       KPI= (select convert(varchar(5),DateDiff(s, (SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE())/3600)+':'+convert(varchar(5),DateDiff(s, (SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE())%3600/60)+':'+convert(varchar(5),(DateDiff(s, (SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE())%60)) as [HH:MM:SS]   
     WHERE AssignID=@TaskAssignId 

end --(This is the end which cause for the error)

if(@Status='Developing')
begin
   UPDATE [TT_TaskAssign]
      SET 
        EstimateTime = @EstimateTime,
        Status = @Status,
        IsDone = @IsDone,
        DevStart = getdate() 
      WHERE AssignID = @TaskAssignId

   UPDATE dbo.TT_TaskAsignKPI
      SET 
        actAsignTime = getdate()+@EstimateTime/24
      WHERE AssignID=@TaskAssignId 

end

END

【问题讨论】:

    标签: sql sql-server tsql stored-procedures sql-server-2005


    【解决方案1】:

    使用以下更新语句。几乎没有语法错误:

       UPDATE dbo.TT_TaskAsignKPI
         SET 
           actTime = convert(varchar(5),DateDiff(s, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), getdate())/3600)+':'+convert(varchar(5),DateDiff(s, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), getdate())%3600/60)+':'+convert(varchar(5),DateDiff(s, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), getdate())%60) 
           ,actTimeNum= DATEDIFF(SECOND, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), GETDATE())
           ,KPINum= DATEDIFF(SECOND,(SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE())
           ,KPI= convert(varchar(5),DateDiff(s, (SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE())/3600)+':'+convert(varchar(5),DateDiff(s, (SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE())%3600/60)+':'+convert(varchar(5),(DateDiff(s, (SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE())%60))
         WHERE AssignID=@TaskAssignId 
    

    【讨论】:

      【解决方案2】:

      UPDATE dbo.TT_TaskAsignKPI 语句中缺少 ),它位于 END 之前

         UPDATE dbo.TT_TaskAsignKPI
           SET 
             actTime = (select convert(varchar(5),DateDiff(s, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), getdate())/3600)+':'+convert(varchar(5),DateDiff(s, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), getdate())%3600/60)+':'+convert(varchar(5),(DateDiff(s, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), getdate())%60)) as [hh:mm:ss], 
             actTimeNum= (SELECT DATEDIFF(SECOND, (SELECT DevStart FROM dbo.TT_TaskAssign WHERE AssignID=@TaskAssignId), GETDATE()) AS SecondDiff, 
             KPINum= (SELECT DATEDIFF(SECOND,(SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE()) AS SecondsKPI,
             KPI= (select convert(varchar(5),DateDiff(s, (SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE())/3600)+':'+convert(varchar(5),DateDiff(s, (SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE())%3600/60)+':'+convert(varchar(5),(DateDiff(s, (SELECT actAsignTime FROM dbo.TT_TaskAsignKPI WHERE AssignID=@TaskAssignId), GETDATE())%60)) as [HH:MM:SS]   
           WHERE AssignID=@TaskAssignId 
      

      您需要在 as [HH:MM:SS] 之前添加另一个 )

      在UPDATE 中不需要像as [HH:MM:SS] 这样的别名。它们也会导致编译错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 2016-06-08
        • 1970-01-01
        • 2013-12-16
        • 2020-06-23
        • 1970-01-01
        相关资源
        最近更新 更多