2016-10-10 88 views
1

我定义这个SQL Server的SP,但我收到以下错误消息,这是不是很详细:END关键字附近的语法错误?

Incorrect syntax near the keyword 'end'. 32 8

我关闭所有BEGINEND,所以我不能让它发动机为什么抱怨。

CREATE PROCEDURE dbo.addReading 
    @deviceId int, 
    @facilityId int, 
    @reading real, 
    @insertionTimestamp datetime2, 
    @isMeter bit 
AS BEGIN 
    IF (@isMeter = 1) 
     BEGIN 
      DECLARE @lastReading real; 
      DECLARE @newReading real; 

      -- Get last reading 
      SELECT @lastReading = lastReading FROM devices 
      WHERE facilityId = @facilityId AND id = @deviceId; 

      -- Update lastReading with the new one 
      UPDATE devices SET lastReading = @reading 
      WHERE facilityId = @facilityId AND id = @deviceId; 

      IF (@lastReading IS NOT NULL) 
       BEGIN 
        SET @newReading = @reading - @lastReading; 

        INSERT INTO readings (deviceId, facilityId, reading, insertionTimestamp) 
        VALUES (@deviceId, @facilityId, @newReading, @insertionTimestamp); 
       END 
      ELSE 
       BEGIN 
        -- Do nothing 
       END 
     END -- ---------------------------------- LINE 32 (ERROR HERE!) 
    ELSE 
     BEGIN 
      INSERT INTO readings (deviceId, facilityId, reading, insertionTimestamp) 
      VALUES (@deviceId, @facilityId, @reading, @insertionTimestamp); 
     END 
END 

GO 

END有什么问题?

+1

你有一个开始..年底最低一行没有任何代码。 Sql服务器不喜欢,删除它并且错误将会消失 – GuidoG

+1

在@lastReading IS NOT NULL后删除提及的else部分 –

回答

6

MSDN

BEGIN 
    { sql_statement | statement_block } 
END 

{sql_statement | statement_block}

是通过使用一个语句块定义 任何有效的Transact-SQL语句或分组。

你需要有BeginEND之间有效的Transact-SQL语句,所以不能有这个

ELSE 
    BEGIN 
    -- Do nothing 
    END 

如果您ELSE部分是不会做任何事情,然后将其删除

IF (@isMeter = 1) 
    BEGIN 
     DECLARE @lastReading real; 
     DECLARE @newReading real; 

     -- Get last reading 
     SELECT @lastReading = lastReading FROM devices 
     WHERE facilityId = @facilityId AND id = @deviceId; 

     -- Update lastReading with the new one 
     UPDATE devices SET lastReading = @reading 
     WHERE facilityId = @facilityId AND id = @deviceId; 

     IF (@lastReading IS NOT NULL) 
      BEGIN 
       SET @newReading = @reading - @lastReading; 

       INSERT INTO readings (deviceId, facilityId, reading, insertionTimestamp) 
       VALUES (@deviceId, @facilityId, @newReading, @insertionTimestamp); 
      END 
    END 
1

如果声明ELSE声明它不能为空。所以如果你只有BEGINEND它会出错。

如果您不想使用ELSE,请将其删除。

1

问题在于其他。您必须在BEGIN和END之间放置代码。评论做什么都不是。如果您希望稍后添加其他内容,则可以添加一个SELECT 0,否则应删除它。

0

BEGIN和END语句需要的代码

BEGIN 
     -- Do nothing 
     PRINT 1 
    END 
相关问题