转换数据类型时SQL过程执行错误

时间:2015-02-09 00:47:26

标签: sql-server stored-procedures

我的一个朋友创建了一个程序,他让我测试它。 当我测试它时,它没有工作,我不知道为什么,它总是说:

Msg 50000, Level 16, State 1, Procedure _RoyalCreateInstance, Line
127 Error occured at RefGameWorld Update/Insert | ERR MSG: Conversion
failed when converting the varchar value 'GAME_WORLD_NORMALIZE_TYPE_A'
to data type bit.

程序:

CREATE PROCEDURE _RoyalCreateInstance 
@Charname VARCHAR(32), 
@AreaName VARCHAR(32), 
@MaxWorlds INT, 
@MaxPlayers INT, 
@MinEntranceLevel TINYINT, 
@MaxEnterPerDay TINYINT, 
@HorseAllowed BIT, 
@JobAllowed BIT, 
@PetAllowed BIT 
AS 

BEGIN TRAN 
BEGIN TRY 

    DECLARE @JobAllowedString VARCHAR(3) = CASE  
                                            WHEN @JobAllowed = 1  
                                                THEN 'OFF' 
                                            ELSE 'ON' 
                                           END, 
            @PetAllowedString VARCHAR(3) = CASE 
                                            WHEN @PetAllowed = 1 
                                                THEN 'OFF' 
                                            ELSE 'ON' 
                                           END, 
            @HorseAllowedString VARCHAR(3) = CASE 
                                                WHEN @HorseAllowed = 1 
                                                    THEN 'OFF' 
                                                ELSE 'ON' 
                                             END, 
            @WorldID INT, 
            @RegionID INT, 
            @PosX REAL, 
            @PosY REAL, 
            @PosZ REAL; 

    SELECT    @RegionID = LatestRegion, 
            @PosX = PosX, 
            @PosY = PosY, 
            @PosZ = PosZ 
    FROM    SRO_VT_SHARD.._Char  
    WHERE    CharName16 = @Charname 

    IF    @RegionID IS NULL 
        BEGIN 
            ROLLBACK TRAN 
            RAISERROR ('Charname not found', 16, 0) 
            RETURN 
        END 

    DELETE FROM     SRO_VT_SHARD.._RefGame_World_Config WHERE GroupCodeName128 = 'GROUP_' + @AreaName 
    INSERT INTO     SRO_VT_SHARD.._RefGame_World_Config (Service, GroupCodeName128, ValueCodeName128, Value, Type) 
    VALUES        (1, 'GROUP' + @AreaName, 'GAME_WORLD_NORMALIZE_TYPE', 'GAME_WORLD_NORMALIZE_TYPE_A', 'STRING'), 
                (1, 'GROUP' + @AreaName, 'ENTER_LIMIT_CONDITION_ENTRY', 'NUM_LIMIT', 'STRING'), 
                (1, 'GROUP' + @AreaName, 'ENTER_LIMIT_CONDITION_PARTY', 'ON', 'STRING'), 
                (1, 'GROUP' + @AreaName, 'ENTER_LIMIT_CONDITION_LEVEL_MINIMUM_NUM', CAST(@MinEntranceLevel AS VARCHAR(5)), 'INT32'), 
                (1, 'GROUP' + @AreaName, 'ENTER_LIMIT_CONDITION_ENTRY_MAXIMUM_NUM', CAST(@MaxEnterPerDay AS VARCHAR(5)), 'INT32'), 
                (1, 'GROUP' + @AreaName, 'ENTER_LIMIT_CONDITION_REENTRY', 'ON', 'STRING'), 
                (1, 'GROUP' + @AreaName, 'ENTER_LIMIT_CONDITION_JOB_CLOTHES_TAKE_OFF', @JobAllowedString, 'STRING'), 
                (1, 'GROUP' + @AreaName, 'ENTER_LIMIT_CONDITION_RIDE_COS_NOT_RIDING', @HorseAllowed, 'STRING'), 
                (1, 'GROUP' + @AreaName, 'ENTER_LIMIT_CONDITION_TRADE_COS_NOT_RIDING', @PetAllowedString, 'STRING'), 
                (1, 'GROUP' + @AreaName, 'ENTER_LIMIT_CONDITION_GAME_WORLD_ASSIGNED', 'ON', 'STRING'), 
                (1, 'GROUP' + @AreaName, 'PARTYMONSTER_SPAWN', 'OFF', 'STRING'), 
                (1, 'GROUP' + @AreaName, 'ENTER_LIMIT_CONDITION_FRPVP_VOUCHER_TAKE_OFF', 'ON', 'STRING'), 
                (1, 'GROUP' + @AreaName, 'REF_GAME_WORLD_NPC', 'INS_' + @AreaName, 'STRING') 

    IF EXISTS(SELECT * FROM SRO_VT_SHARD.._RefGame_World WHERE WorldCodeName128 = 'INS_' + @AreaName) 
        BEGIN 
            UPDATE    SRO_VT_SHARD.._RefGame_World  
            SET        Type = 1,  
                    WorldMaxCount = @MaxWorlds,  
                    WorldMaxUserCount = @MaxPlayers,  
                    WorldDurationTime = 7200000,  
                    WorldEmptyRemainTime = 300000  
            WHERE    WorldCodeName128 = 'INS_' + @AreaName 
        END 
    ELSE IF NOT EXISTS(SELECT * FROM SRO_VT_SHARD.._RefGame_World WHERE WorldCodeName128 = 'INS_' + @AreaName) 
        BEGIN 
            INSERT INTO SRO_VT_SHARD.._RefGame_World (WorldCodeName128, Type, WorldMaxCount, WorldMaxUserCount, WorldEntryType, WorldEntranceType, WorldLeaveType, WorldDurationTime, WorldEmptyRemainTime, ConfigGroupCodeName128) 
            SELECT        'INS_' + @AreaName, 1, @MaxWorlds, @MaxPlayers, 0, 0, 0, 7200000, 300000, 'GROUP_' + @AreaName     
        END 

    IF EXISTS(SELECT * FROM SRO_VT_SHARD.._RefTeleport WHERE CodeName128 LIKE 'GATE_' + @AreaName) 
        BEGIN 
            UPDATE    SRO_VT_SHARD.._RefTeleport 
            SET        GenWorldID = @WorldID 
            WHERE    CodeName128 LIKE 'GATE_' + @AreaName 

            SELECT    Service, ID, CodeName128, AssocRefObjCodeName128, AssocRefObjID, ZoneName128, GenRegionID, GenPos_X, GenPos_Y, GenPos_Z, GenAreaRadius, CanBeResurrectPos, CanGotoResurrectPos, GenWorldID 
            FROM    SRO_VT_SHARD.._RefTeleport 
            WHERE    CodeName128 LIKE 'GATE_' + @AreaName 
        END 
    ELSE 
        BEGIN 
            SELECT 'Could''t find _RefTeleport line, after you''ve create a teleporter run the following query: ' 
            SELECT 'UPDATE _RefTeleport SET GenWorldID = @WorldID WHERE CodeName128 LIKE ''PORTERNAMEHERE'' ' 
        END 

    SELECT        *, '', 'OLD LINES!!! @_RefInstance_World_Region' 
    FROM        SRO_VT_SHARD.._RefInstance_World_Region 
    WHERE        RegionID = @RegionID 

    DELETE FROM    SRO_VT_SHARD.._RefInstance_World_Region WHERE RegionID = @RegionID 
    INSERT INTO SRO_VT_SHARD.._RefInstance_World_Region (WorldID, RegionID) 
    VALUES        (1, @RegionID), 
                (@WorldID, @RegionID) 

    SELECT        'Old lines at _RefInstance_World_Region have been deleted' 

    SELECT        *, '', 'OLD LINES!!! @_RefInstance_World_Start_Pos & new ones added' 
    FROM        SRO_VT_SHARD.._RefInstance_World_Start_Pos 
    WHERE        RegionID = @RegionID 

    DELETE FROM    SRO_VT_SHARD.._RefInstance_World_Start_Pos 
    INSERT INTO SRO_VT_SHARD.._RefInstance_World_Start_Pos (WorldID, RegionID, PosX, PosY, PosZ, Param) 
    SELECT        @WorldID, @RegionID, @PosX, @PosY, @PosZ, 0 

    SELECT        'Old lines at _RefInstance_World_Start_Pos have been deleted & new ones added' 


END TRY 

BEGIN CATCH 
    DECLARE        @ErMessage NVARCHAR(2048) = 'Error occured at RefGameWorld Update/Insert | ERR MSG: ' + ERROR_MESSAGE(), 
                @ErSeverity INT = ERROR_SEVERITY(), 
                @ErState INT = ERROR_STATE(); 
    RAISERROR    (@ErMessage, @ErSeverity, @ErState) 
    ROLLBACK TRAN 
    RETURN 

END CATCH 

COMMIT TRAN  

我希望有人可以帮助我,我们非常感激。

1 个答案:

答案 0 :(得分:0)

错误有点奇怪,但也许这就是问题:

  

(1,'GROUP'+ @AreaName,'ENTER_LIMIT_CONDITION_RIDE_COS_NOT_RIDING',   @HorseAllowed,'STRING'),

它应该使用字符串变量?

  

(1,'GROUP'+ @AreaName,'ENTER_LIMIT_CONDITION_RIDE_COS_NOT_RIDING',    @HorseAllowedString ,'STRING'),