2015-02-09 36 views
-1

我的一個朋友創建了一個程序,他讓我測試它。 當我測試了它,它不工作,我不知道爲什麼,總是說:轉換數據類型時的SQL程序執行錯誤

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 

我希望有人能幫助我,那會非常感謝。

+0

你檢查表SRO_VT_SHARD .._ RefGame_World_Config的數據類型?看起來你已經定義了列值而不是varchar – 2015-02-09 03:10:24

+0

是的,我已經檢查過它,它也是varchar。 – Youssef 2015-02-09 17:13:09

+0

表中是否有觸發器? – 2015-02-09 17:14:17

回答

0

的錯誤是有點怪異,但也許這就是問題:

(1, '集團' + @AreaName, 'ENTER_LIMIT_CONDITION_RIDE_COS_NOT_RIDING', @HorseAllowed, 'STRING'),

它應該使用字符串變量?

(1, '集團' + @AreaName, 'ENTER_LIMIT_CONDITION_RIDE_COS_NOT_RIDING', @HorseAllowedString, 'STRING'),

+0

好的,我這樣做了,但程序執行仍然有錯誤。 Msg 50000,Level 16,State 1,Procedure _RoyalCreateInstance,Line 127 RefGameWorld發生錯誤更新/插入| ERR MSG:將varchar值「GAME_WORLD_NORMALIZE_TYPE_A」轉換爲數據類型位時轉換失敗。 – Youssef 2015-02-09 17:32:07

+0

您是否檢查是否存在插入觸發器(或者可能是檢查約束)?由於程序或表中沒有BIT類型,因此無法確定該錯誤可能來自哪裏。 – 2015-02-09 17:42:43

相關問題