2014-04-12 33 views
-1
USE [Kn_online] 

GO /** Object: StoredProcedure [dbo].[LOAD_KNIGHTS_SIEGE_WARFARE_USERS] Script Date: 04/12/2014 13:51:24 **/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[LOAD_KNIGHTS_SIEGE_WARFARE_USERS] @strUserId char(25) AS /* Author : AKUMA Update : 25.10.2009 - 14:23 */ DECLARE @Knights smallint DECLARE @MasterKnightsID smallint DECLARE @CSWFreeLoyaltyUpdateTime datetime DECLARE @AddedLoyalty int DECLARE @IsOnline tinyint SET @AddedLoyalty = 25 SELECT @Knights = Knights FROM USERDATA WHERE strUserId = @strUserId SELECT @MasterKnightsID = sMasterKnights FROM KNIGHTS_SIEGE_WARFARE WHERE sCastleIndex = 1 IF (@Knights <> 0) AND (@Knights = @MasterKnightsID) BEGIN SELECT @CSWFreeLoyaltyUpdateTime = CSWFreeLoyaltyUpdateTime FROM USERDATA WHERE strUserId = @strUserId IF DATEDIFF(day,@CSWFreeLoyaltyUpdateTime,GETDATE()) >= 1 UPDATE USERDATA SET Loyalty = Loyalty + @AddedLoyalty,CSWFreeLoyaltyUpdateTime = GETDATE() WHERE strUserId = @strUserId ELSE IF @CSWFreeLoyaltyUpdateTime IS NULL UPDATE USERDATA SET Loyalty = Loyalty + @AddedLoyalty,CSWFreeLoyaltyUpdateTime = GETDATE() WHERE strUserId = @strUserId DECLARE KSWU_CURSOR CURSOR FOR SELECT strUserId FROM USERDATA WHERE Knights = @MasterKnightsID OPEN KSWU_CURSOR FETCH NEXT FROM KSWU_CURSOR INTO @strUserId WHILE @@FETCH_STATUS = 0 BEGIN SET @CSWFreeLoyaltyUpdateTime = 0 SET @IsOnline = 0 SELECT @IsOnline = COUNT(strCharID) FROM CURRENTUSER WHERE strCharID = @strUserId IF @IsOnline = 0 BEGIN SELECT @CSWFreeLoyaltyUpdateTime = CSWFreeLoyaltyUpdateTime FROM USERDATA WHERE strUserId = @strUserId IF DATEDIFF(day,@CSWFreeLoyaltyUpdateTime,GETDATE()) >= 1 UPDATE USERDATA SET Loyalty = Loyalty + @AddedLoyalty,CSWFreeLoyaltyUpdateTime = GETDATE() WHERE strUserId = @strUserId ELSE IF @CSWFreeLoyaltyUpdateTime IS NULL UPDATE USERDATA SET Loyalty = Loyalty + @AddedLoyalty,CSWFreeLoyaltyUpdateTime = GETDATE() WHERE strUserId = @strUserId END FETCH NEXT FROM KSWU_CURSOR INTO @strUserId END CLOSE KSWU_CURSOR DEALLOCATE KSWU_CURSOR END必須declaret標量變量EXEC

EXEC LOAD_KNIGHTS_SIEGE_WARFARE_USERS @strUserid

當我使用它在其他程序錯誤:必須聲明標量變量

回答

0

什麼亂七八糟的查詢,通過你錯過了一個END方式在您的查詢中,如下測試並讓我知道結果

GO 
SET ANSI_NULLS ON GO 
SET QUOTED_IDENTIFIER ON GO 
ALTER PROCEDURE [dbo].[LOAD_KNIGHTS_SIEGE_WARFARE_USERS] @strUserId char(25) AS DECLARE @Knights smallint DECLARE @MasterKnightsID smallint DECLARE @CSWFreeLoyaltyUpdateTime datetime DECLARE @AddedLoyalty int DECLARE @IsOnline tinyint 
SET @AddedLoyalty = 25 
SELECT @Knights = Knights 
FROM USERDATA 
WHERE strUserId = @strUserId 
    SELECT @MasterKnightsID = sMasterKnights 
    FROM KNIGHTS_SIEGE_WARFARE WHERE sCastleIndex = 1 
    IF (@Knights <> 0) AND (@Knights = @MasterKnightsID) 
    BEGIN 
     SELECT @CSWFreeLoyaltyUpdateTime = CSWFreeLoyaltyUpdateTime 
     FROM USERDATA WHERE strUserId = @strUserId IF DATEDIFF(DAY,@CSWFreeLoyaltyUpdateTime,GETDATE()) >= 1 
     UPDATE USERDATA 
     SET Loyalty = Loyalty + @AddedLoyalty, 
      CSWFreeLoyaltyUpdateTime = GETDATE() 
     WHERE strUserId = @strUserId 
--This END is missing in your code 
    END 
    ELSE IF @CSWFreeLoyaltyUpdateTime IS NULL 
     UPDATE USERDATA 
     SET Loyalty = Loyalty + @AddedLoyalty, 
      CSWFreeLoyaltyUpdateTime = GETDATE() WHERE strUserId = @strUserId 
------------------------------------------------------ 
    DECLARE KSWU_CURSOR 
    CURSOR 
    FOR 
    SELECT strUserId 
     FROM USERDATA WHERE Knights = @MasterKnightsID 
    OPEN KSWU_CURSOR 
    FETCH NEXT FROM KSWU_CURSOR INTO @strUserId 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @CSWFreeLoyaltyUpdateTime = 0 
     SET @IsOnline = 0 
     SELECT @IsOnline = COUNT(strCharID) 
     FROM CURRENTUSER WHERE strCharID = @strUserId 
     IF @IsOnline = 0 
     BEGIN 
      SELECT @CSWFreeLoyaltyUpdateTime = CSWFreeLoyaltyUpdateTime 
      FROM USERDATA WHERE strUserId = @strUserId 
      IF DATEDIFF(DAY,@CSWFreeLoyaltyUpdateTime,GETDATE()) >= 1 
       UPDATE USERDATA 
       SET Loyalty = Loyalty + @AddedLoyalty, 
        CSWFreeLoyaltyUpdateTime = GETDATE() WHERE strUserId = @strUserId 
      ELSE IF @CSWFreeLoyaltyUpdateTime IS NULL 
       UPDATE USERDATA 
       SET Loyalty = Loyalty + @AddedLoyalty, 
        CSWFreeLoyaltyUpdateTime = GETDATE() WHERE strUserId = @strUserId 
     END 
     FETCH NEXT FROM KSWU_CURSOR INTO @strUserId 
    END 
    CLOSE KSWU_CURSOR 
    DEALLOCATE KSWU_CURSOR 
END