none
Procedure + Código RRS feed

  • Pergunta

  • Olá pessoal, venho estudando muito SQL lendo e analisando vários códigos e através de tentativas e erros consegui elaborar algumas coisinhas já porém estou trabalhando em uma nova procedure para meu projeto Porem existe 1 erro que eu não consigo solucionar

    USE [Server01]
    GO
    /****** Object:  StoredProcedure [dbo].[SP_Character_Change_Class]    Script Date: 21/12/2019 13:06:34 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[SP_Character_Change_Class]
    	@CharacterIdx bigint,
    	@NewBattleStyle int,
    	@isAbsolute tinyint = 0
    AS
    BEGIN
    	DECLARE @_result int
    
    	DECLARE @newSkillData varbinary(MAX)
    	DECLARE @newQuickSlotData varbinary(255)
    
    	SELECT @newSkillData = SkillData, @newQuickSlotData = QuickSlotData FROM SERVER01.dbo.cabal_new_character_data WHERE ClassType = @NewBattleStyle
    	IF(@@ROWCOUNT = 0)
    	BEGIN
    		-- Classe Invalida
    		SELECT @_result = -2
    		GOTO finish;
    	END
    
    	DECLARE @login int
    	DECLARE @p_str int
    	DECLARE @p_int int
    	DECLARE @p_dex int
    	DECLARE @p_pnt int
    	SELECT 
    		@login = Login,
    		@p_str = STR,
    		@p_int = INT,
    		@p_dex = DEX,
    		@p_pnt = PNT
    	FROM Server01.dbo.cabal_character_table WHERE CharacterIdx = @CharacterIdx
    	IF(@@ROWCOUNT = 0)
    	BEGIN
    		-- Personagem não Encontrado
    		SELECT @_result = -1
    		GOTO finish;
    	END
    
    	IF(@isAbsolute = 0 AND @login != 0)
    	BEGIN
    		-- Personagem Online
    		SELECT @_result = -4
    		GOTO finish;
    	END
    
    	-- Verificar Skills
    	DECLARE @currentSkillData varbinary(MAX)
    	DECLARE @convertedCurrentSkillData varchar(MAX)
    
    	SELECT @currentSkillData = Data FROM cabal_skilllist_table WHERE CharacterIdx = @CharacterIdx
    	SET @convertedCurrentSkillData = CONVERT(VARCHAR(MAX), @currentSkillData, 1)
    
    	DECLARE @UserNum int
    	SET @UserNum = @CharacterIdx/8
    
    	-- Combo
    	IF(CHARINDEX('A301014700', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Combo
    		SET @newSkillData = @newSkillData + 0xA301014700
    	END
    
    	--  Moto
    	IF(CHARINDEX('A401014400', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Moto
    		SET @newSkillData = @newSkillData + 0xA401014400
    	END
    
    	--  Prancha
    	IF(CHARINDEX('C401014500', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Prancha
    		SET @newSkillData = @newSkillData + 0xC401014500
    	END
    
    	--  Over
    	IF(CHARINDEX('5F00015200', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Over
    		SET @newSkillData = @newSkillData + 0x5F00015200
    	END
    		--  Over 02
    	IF(CHARINDEX('5F00025200', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Over
    		SET @newSkillData = @newSkillData + 0x5F00025200
    	END
    
    	--  Over 03
    	IF(CHARINDEX('5F00035200', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Over
    		SET @newSkillData = @newSkillData + 0x5F00035200
    	END
    	
    	--  Over 04
    	IF(CHARINDEX('5F00045200', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Over
    		SET @newSkillData = @newSkillData + 0x5F00045200
    	END
    	
    	--  Over 05
    	IF(CHARINDEX('5F00055200', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Over
    		SET @newSkillData = @newSkillData + 0x5F00055200
    	END
    	
    	--  Over 06
    	IF(CHARINDEX('5F00065200', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Over
    		SET @newSkillData = @newSkillData + 0x5F00065200
    	END
    	
    	--  Over 07
    	IF(CHARINDEX('5F00075200', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Over
    		SET @newSkillData = @newSkillData + 0x5F00075200
    	END
    		
    	--  Over 08
    	IF(CHARINDEX('5F00085200', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Over
    		SET @newSkillData = @newSkillData + 0x5F00085200
    	END
    		
    	--  Over 09
    	IF(CHARINDEX('5F00095200', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Over
    		SET @newSkillData = @newSkillData + 0x5F00095200
    	END
    
    		--  Over 10
    	IF(CHARINDEX('5F000A5200', @convertedCurrentSkillData) > 0)
    	BEGIN
    		-- Manter Over
    		SET @newSkillData = @newSkillData + 0x5F000A5200
    	END
    
    	BEGIN TRAN updt
    
    	UPDATE Server01.dbo.cabal_character_table SET 
    		Style = ((Style - (Style & (POWER(2, 3) - 1))) + @NewBattleStyle),
    		STR = 0,
    		INT = 0,
    		DEX = 0,
    		PNT = (@p_str + @p_int + @p_dex + @p_pnt)
    	WHERE CharacterIdx = @CharacterIdx
    	IF(@@ROWCOUNT = 0)
    	BEGIN
    		-- Falha ao Atualizar Classe
    		ROLLBACK TRAN updt
    		SELECT @_result = -3
    		GOTO finish;
    	END
    
    	UPDATE Server01.dbo.cabal_skilllist_table SET Data = @newSkillData WHERE CharacterIdx = @CharacterIdx
    	IF(@@ROWCOUNT = 0)
    	BEGIN
    		-- Falha Ao Atualizar o SkillData
    		ROLLBACK TRAN updt
    		SELECT @_result = -3
    		GOTO finish;
    	END
    
    	UPDATE Server01.dbo.cabal_quickslot_table SET Data = @newQuickSlotData WHERE CharacterIdx = @CharacterIdx
    	IF(@@ROWCOUNT = 0)
    	BEGIN
    		-- Falha ao Atualiza o QuickSlotData
    		ROLLBACK TRAN updt
    		SELECT @_result = -3
    		GOTO finish;
    	END
    
    	-- Enviar Um item Especifico!
    	EXEC CabalCash.dbo.up_AddMyCashItemByItem @UserNum, 1, 1, 525043, 281, 0
    
    	COMMIT TRAN updt
    	
    	SELECT @_result = 0
    	GOTO finish;
        
        finish:
    		SELECT @_result as result;
    		RETURN;
    END
    
    Bom o erro é o seguinte, na parte de "localizar e manter a skill ele sempre deleta, indiferente do que eu coloque"

    desculpa estar incomodando vcs de novo xD

    sábado, 21 de dezembro de 2019 17:57

Respostas

  • Bom, dei uma analisada em todos os links que vcs passaram, mesmo aprendendo algumas coisas e utilizando algumas dicas e absorvendo + conhecimento, eu resolvi abordar o problema de uma forma diferente e mais simples

    eu criei uma procedure nova que faz uma verificação na skill que eu quero Exemplo (skill 100) e insere essa skill em uma tabela
    logo em seguida eu fiz uma modificação na procedura que eu postei aqui e acrescentei um exec nela no inicio do código e
    assim fazendo a procedure ter 3 partes
    a primeira ela executa a procedure de checagem, inserindo na tabela nova as skills que vão ser salvas.
    segundo ele faz toda a sequencia e troca a classe do personagem
    na terceira e ultima parte ele adiciona as skills que estão salvas tabela no personagem. Assim concluindo toda a troca de classe

    ficou meio amador na minha opinião, mas bastante funcional e de uma maneira bem simples de se resolver.

    domingo, 22 de dezembro de 2019 19:53

Todas as Respostas

  • Deleted
    sábado, 21 de dezembro de 2019 19:28
  • No trecho

       SELECT @newSkillData = SkillData, @newQuickSlotData = QuickSlotData FROM SERVER01.dbo.cabal_new_character_data WHERE ClassType = @NewBattleStyle

    é possível que SkillData esteja sem informação (isto é, NULL)?



    não, é um valor data fixo para cada classe, porem ele teria que somar esse valor + as skills que eu declarei no inicio do código, mas oque ele esta fazendo é apenas dar SET com o data fixo. esta ignorando as declarações que eu fiz no inicio do acho que esta gerando falso positivo, como você sabe eu n entendo muito infelizmente.

    a intenção era verificar se o personagem tem as skills que eu declarei, e caso ele possua ele somar o @skilldata + a skill que ele identificou
    • Editado karygalock1 sábado, 21 de dezembro de 2019 19:35
    sábado, 21 de dezembro de 2019 19:34
  • Olá pessoal, venho estudando muito SQL lendo e analisando vários códigos e através de tentativas e erros consegui elaborar algumas coisinhas já porém estou trabalhando em uma nova procedure para meu projeto Porem existe 1 erro que eu não consigo solucionar

    USE [Server01] GO /****** Object: StoredProcedure [dbo].[SP_Character_Change_Class] Script Date: 21/12/2019 13:06:34 ******/ SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO ALTER PROCEDURE [dbo].[SP_Character_Change_Class] @CharacterIdx bigint, @NewBattleStyle int, @isAbsolute tinyint = 0 AS BEGIN DECLARE @_result int; DECLARE @newSkillData varbinary(MAX); DECLARE @newQuickSlotData varbinary(255); SELECT @newSkillData = SkillData, @newQuickSlotData = QuickSlotData

    FROM SERVER01.dbo.cabal_new_character_data

    WHERE ClassType = @NewBattleStyle;

    GO

    IF(@@ROWCOUNT = 0) BEGIN -- Classe Invalida SELECT @_result = -2 GOTO finish; END;

    GO

    DECLARE @login int; DECLARE @p_str int; DECLARE @p_int int; DECLARE @p_dex int; DECLARE @p_pnt int; SELECT @login = Login, @p_str = STR, @p_int = INT, @p_dex = DEX, @p_pnt = PNT FROM Server01.dbo.cabal_character_table WHERE CharacterIdx = @CharacterIdx;

    GO

    IF(@@ROWCOUNT = 0) BEGIN -- Personagem não Encontrado SELECT @_result = -1 GOTO finish; END;

    GO

    IF(@isAbsolute = 0 AND @login != 0) BEGIN -- Personagem Online SELECT @_result = -4 GOTO finish; END;

    GO

    -- Verificar Skills DECLARE @currentSkillData varbinary(MAX); DECLARE @convertedCurrentSkillData varchar(MAX); SELECT @currentSkillData = Data FROM cabal_skilllist_table

    WHERE CharacterIdx = @CharacterIdx;

    GO

    SET @convertedCurrentSkillData = CONVERT(VARCHAR(MAX), @currentSkillData, 1); DECLARE @UserNum int; SET @UserNum = @CharacterIdx/8;

    GO

    -- Combo IF(CHARINDEX('A301014700', @convertedCurrentSkillData) > 0) BEGIN -- Manter Combo SET @newSkillData = @newSkillData + 0xA301014700; END;

    GO

    -- Moto IF(CHARINDEX('A401014400', @convertedCurrentSkillData) > 0) BEGIN -- Manter Moto SET @newSkillData = @newSkillData + 0xA401014400; END;

    GO

    -- Prancha IF(CHARINDEX('C401014500', @convertedCurrentSkillData) > 0) BEGIN -- Manter Prancha SET @newSkillData = @newSkillData + 0xC401014500; END;

    GO

    -- Over IF(CHARINDEX('5F00015200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00015200; END;

    GO

    -- Over 02 IF(CHARINDEX('5F00025200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00025200; END;

    GO -- Over 03 IF(CHARINDEX('5F00035200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00035200; END;

    GO -- Over 04 IF(CHARINDEX('5F00045200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00045200; END;

    GO -- Over 05 IF(CHARINDEX('5F00055200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00055200; END; GO

    -- Over 06 IF(CHARINDEX('5F00065200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00065200; END; GO

    -- Over 07 IF(CHARINDEX('5F00075200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00075200; END; GO

    -- Over 08 IF(CHARINDEX('5F00085200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00085200; END; GO

    -- Over 09 IF(CHARINDEX('5F00095200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00095200; END; GO

    -- Over 10 IF(CHARINDEX('5F000A5200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F000A5200; END; GO

    BEGIN TRAN updt UPDATE Server01.dbo.cabal_character_table SET Style = ((Style - (Style & (POWER(2, 3) - 1))) + @NewBattleStyle), STR = 0, INT = 0, DEX = 0, PNT = (@p_str + @p_int + @p_dex + @p_pnt) WHERE CharacterIdx = @CharacterIdx;

    GO

    IF(@@ROWCOUNT = 0) BEGIN -- Falha ao Atualizar Classe ROLLBACK TRAN updt SELECT @_result = -3 GOTO finish; END; GO

    UPDATE Server01.dbo.cabal_skilllist_table SET Data = @newSkillData

    WHERE CharacterIdx = @CharacterIdx;

    GO

    IF(@@ROWCOUNT = 0) BEGIN -- Falha Ao Atualizar o SkillData ROLLBACK TRAN updt SELECT @_result = -3 GOTO finish; END; GO

    UPDATE Server01.dbo.cabal_quickslot_table SET Data = @newQuickSlotData

    WHERE CharacterIdx = @CharacterIdx;

    GO

    IF(@@ROWCOUNT = 0) BEGIN -- Falha ao Atualiza o QuickSlotData ROLLBACK TRAN updt SELECT @_result = -3 GOTO finish; END; GO

    -- Enviar Um item Especifico! EXEC CabalCash.dbo.up_AddMyCashItemByItem @UserNum, 1, 1, 525043, 281, 0 COMMIT TRAN updt SELECT @_result = 0 GOTO finish; finish: SELECT @_result as result; RETURN; END

    Bom o erro é o seguinte, na parte de "localizar e manter a skill ele sempre deleta, indiferente do que eu coloque"

    desculpa estar incomodando vcs de novo xD

    No seu código em todas as instruções SET e DECLARE e UPDATE WHERE  e IF ELSE faltou colocar o ; (ponto e vírgula) e GO no final.  Testa de novo



    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful




    • Editado Ana Gauna sábado, 21 de dezembro de 2019 21:22
    sábado, 21 de dezembro de 2019 20:46

  • No seu código em todas as instruções UPDATE WHERE faltou colocar o ; (ponto e vírgula) e GO no final

    No seu código em todos os IF THEN ELSE faltou colocar o GO no final.  Testa de novo.



    infelizmente mesmo com essas modificações o problema persiste, mas obrigado a ajuda mesmo assim! mais um detalhe de mt valor :D
    sábado, 21 de dezembro de 2019 21:14
  • SELECT @newSkillData AS SkillData, @newQuickSlotData AS QuickSlotData

    FROM SERVER01.dbo.cabal_new_character_data WHERE ClassType = @NewBattleStyle;

    GO


    e

    SELECT @login AS Login, @p_str AS STR, @p_int AS INT, @p_dex AS DEX, @p_pnt AS PNT FROM Server01.dbo.cabal_character_table

    WHERE CharacterIdx = @CharacterIdx;

    GO

    ali tem problema porque STR e INT são palavras reservadas do SQL

    e

    SELECT @currentSkillData AS Data

    FROM cabal_skilllist_table WHERE CharacterIdx = @CharacterIdx;

    GO



    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful


    • Editado Ana Gauna sábado, 21 de dezembro de 2019 22:13
    sábado, 21 de dezembro de 2019 21:49
  • Bom o erro é o seguinte, na parte de "localizar e manter a skill ele sempre deleta, indiferente do que eu coloque"


    desculpa estar incomodando vcs de novo xD

    Karygalock1,

    Quando você se refere ao erro que esta sendo relatado, em qual parte do seu código esta procedure teoricamente realiza uma ação de delete? No seu código no consta nada.

    O que é realizado antes da execução da mesma e depois?

    Você já verificou se o trecho abaixo esta retornando algum valor para variável: @currentSkillData

    SELECT @currentSkillData = Data FROM cabal_skilllist_table WHERE CharacterIdx = @CharacterIdx
    SET @convertedCurrentSkillData = CONVERT(VARCHAR(MAX), @currentSkillData, 1)


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sábado, 21 de dezembro de 2019 22:46
  • Olá pessoal, venho estudando muito SQL lendo e analisando vários códigos e através de tentativas e erros consegui elaborar algumas coisinhas já porém estou trabalhando em uma nova procedure para meu projeto Porem existe 1 erro que eu não consigo solucionar

    USE [Server01] GO /****** Object: StoredProcedure [dbo].[SP_Character_Change_Class] Script Date: 21/12/2019 13:06:34 ******/ SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO ALTER PROCEDURE [dbo].[SP_Character_Change_Class] @CharacterIdx bigint, @NewBattleStyle int, @isAbsolute tinyint = 0 AS BEGIN DECLARE @_result int; DECLARE @newSkillData varbinary(MAX); DECLARE @newQuickSlotData varbinary(255); SELECT @newSkillData = SkillData, @newQuickSlotData = QuickSlotData

    FROM SERVER01.dbo.cabal_new_character_data

    WHERE ClassType = @NewBattleStyle;

    GO

    IF(@@ROWCOUNT = 0) BEGIN -- Classe Invalida SELECT @_result = -2 GOTO finish; END;

    GO

    DECLARE @login int; DECLARE @p_str int; DECLARE @p_int int; DECLARE @p_dex int; DECLARE @p_pnt int; SELECT @login = Login, @p_str = STR, @p_int = INT, @p_dex = DEX, @p_pnt = PNT FROM Server01.dbo.cabal_character_table WHERE CharacterIdx = @CharacterIdx;

    GO

    IF(@@ROWCOUNT = 0) BEGIN -- Personagem não Encontrado SELECT @_result = -1 GOTO finish; END;

    GO

    IF(@isAbsolute = 0 AND @login != 0) BEGIN -- Personagem Online SELECT @_result = -4 GOTO finish; END;

    GO

    -- Verificar Skills DECLARE @currentSkillData varbinary(MAX); DECLARE @convertedCurrentSkillData varchar(MAX); SELECT @currentSkillData = Data FROM cabal_skilllist_table

    WHERE CharacterIdx = @CharacterIdx;

    GO

    SET @convertedCurrentSkillData = CONVERT(VARCHAR(MAX), @currentSkillData, 1); DECLARE @UserNum int; SET @UserNum = @CharacterIdx/8;

    GO

    -- Combo IF(CHARINDEX('A301014700', @convertedCurrentSkillData) > 0) BEGIN -- Manter Combo SET @newSkillData = @newSkillData + 0xA301014700; END;

    GO

    -- Moto IF(CHARINDEX('A401014400', @convertedCurrentSkillData) > 0) BEGIN -- Manter Moto SET @newSkillData = @newSkillData + 0xA401014400; END;

    GO

    -- Prancha IF(CHARINDEX('C401014500', @convertedCurrentSkillData) > 0) BEGIN -- Manter Prancha SET @newSkillData = @newSkillData + 0xC401014500; END;

    GO

    -- Over IF(CHARINDEX('5F00015200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00015200; END;

    GO

    -- Over 02 IF(CHARINDEX('5F00025200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00025200; END;

    GO -- Over 03 IF(CHARINDEX('5F00035200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00035200; END;

    GO -- Over 04 IF(CHARINDEX('5F00045200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00045200; END;

    GO -- Over 05 IF(CHARINDEX('5F00055200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00055200; END; GO

    -- Over 06 IF(CHARINDEX('5F00065200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00065200; END; GO

    -- Over 07 IF(CHARINDEX('5F00075200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00075200; END; GO

    -- Over 08 IF(CHARINDEX('5F00085200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00085200; END; GO

    -- Over 09 IF(CHARINDEX('5F00095200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F00095200; END; GO

    -- Over 10 IF(CHARINDEX('5F000A5200', @convertedCurrentSkillData) > 0) BEGIN -- Manter Over SET @newSkillData = @newSkillData + 0x5F000A5200; END; GO

    BEGIN TRAN updt UPDATE Server01.dbo.cabal_character_table SET Style = ((Style - (Style & (POWER(2, 3) - 1))) + @NewBattleStyle), STR = 0, INT = 0, DEX = 0, PNT = (@p_str + @p_int + @p_dex + @p_pnt) WHERE CharacterIdx = @CharacterIdx;

    GO

    IF(@@ROWCOUNT = 0) BEGIN -- Falha ao Atualizar Classe ROLLBACK TRAN updt SELECT @_result = -3 GOTO finish; END; GO

    UPDATE Server01.dbo.cabal_skilllist_table SET Data = @newSkillData

    WHERE CharacterIdx = @CharacterIdx;

    GO

    IF(@@ROWCOUNT = 0) BEGIN -- Falha Ao Atualizar o SkillData ROLLBACK TRAN updt SELECT @_result = -3 GOTO finish; END; GO

    UPDATE Server01.dbo.cabal_quickslot_table SET Data = @newQuickSlotData

    WHERE CharacterIdx = @CharacterIdx;

    GO

    IF(@@ROWCOUNT = 0) BEGIN -- Falha ao Atualiza o QuickSlotData ROLLBACK TRAN updt SELECT @_result = -3 GOTO finish; END; GO

    -- Enviar Um item Especifico! EXEC CabalCash.dbo.up_AddMyCashItemByItem @UserNum, 1, 1, 525043, 281, 0 COMMIT TRAN updt SELECT @_result = 0 GOTO finish; finish: SELECT @_result as result; RETURN; END

    Bom o erro é o seguinte, na parte de "localizar e manter a skill ele sempre deleta, indiferente do que eu coloque"

    desculpa estar incomodando vcs de novo xD

    No seu código em todas as instruções SET e DECLARE e UPDATE WHERE  e IF ELSE faltou colocar o ; (ponto e vírgula) e GO no final.  Testa de novo



    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful




    Ana,

    Com todo respeito, a partir do momento que declarada o ponto e vírgula torna-se desnecessário utilizar o GO!!!

    Outra observação, dentro do código fonte de Stored Procedure o GO é totalmente desnecessário, além disso, o mesmo não é um comando da linguagem T-SQL, ele pertence ao SQL Server Management Studio, pode também ser utilizando em utilitários de linha de comando como SQLCMD e OSQL.

    Caso queria saber mais sobre o comando GO seu comportamento e restrições, acesse: 
    https://docs.microsoft.com/en-us/sql/t-sql/language-elements/sql-server-utilities-statements-go?view=sql-server-ver15


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sábado, 21 de dezembro de 2019 22:52
  • Deleted
    sábado, 21 de dezembro de 2019 22:55

  • No seu código em todas as instruções SET e DECLARE e UPDATE WHERE  e IF ELSE faltou colocar o ; (ponto e vírgula) e GO no final.  Testa de novo



    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful




    Karylock1,

    Não é necessário o uso do GO dentro do código da sua Stored Procedure, alias isso poderá provocar alguns erros, relacionados ao uso de variáveis, pois como este comando é reconhecido como elemento para encerrar um conjunto de instruções ou blocos de código, o SQL Server ao realizar o processamento da instrução poderá acabar removendo ou impedindo o uso de alguns elementos que possam estar em memória, mais especificamente variáveis.

    No que se refere ao sinal de ponto e vírgula, analise o uso para evitar o encerramento incorreto de uma linha ou bloco de código.

    Caso queira saber mais sobre o comando GO, acesse:

    https://docs.microsoft.com/en-us/sql/t-sql/language-elements/sql-server-utilities-statements-go?view=sql-server-ver15


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sábado, 21 de dezembro de 2019 22:58
  • Eu vi vários exemplos de códigos SQL dentro do site Microsoft DOCs, todos tinham o GO no final depois do ponto e virgula, e li que o GO quer dizer que aquela instrução finalizou.

    E ele está usando palavras reservadas do SQL, como se fossem variáveis, li tem poucos minutos que LOGIN é também uma das palavras reservadas do Transact SQL. A palavra login não pode ser utilizada como variável.

    Eu estou consultando os comandos do Transact-SQL aqui dentro, tem vários exemplos = https://docs.microsoft.com/pt-br/sql/t-sql/statements/create-login-transact-sql?view=sql-server-ver15


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful


    • Editado Ana Gauna sábado, 21 de dezembro de 2019 23:11
    sábado, 21 de dezembro de 2019 23:08
  • Eu vi vários exemplos de códigos SQL dentro do site Microsoft DOCs, todos tinham o GO no final depois do ponto e virgula, e li que o GO quer dizer que aquela instrução finalizou.

    E ele está usando palavras reservadas do SQL, como se fossem variáveis, li tem poucos minutos que LOGIN é também uma das palavras reservadas do Transact SQL. A palavra login não pode ser utilizada como variável.


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

    Ana,

    Eu fiz referência específica ao comando GO, não fiz nenhuma abordagem as palavras reservadas, a questão do código dela não é essa.

    Além disso, adicionei o link da documentação oficial, veja estes trechos extraído da documentação oficial:

    O SQL Server fornece comandos que não são instruções Transact-SQL, mas que são reconhecidos pelos utilitários sqlcmd e osql e pelo Editor de Códigos SQL Server Management Studio. Estes comandos podem ser usados para facilitar a legibilidade e a execução de lotes e scripts.

    O GO sinaliza o término de um lote de instruções Transact-SQL para os utilitários do SQL Server.

    ----------------------------

    Os aplicativos baseados em APIs ODBC ou OLE DB recebem um erro de sintaxe quando tentam executar um comando GO. Os utilitários do SQL Server nunca enviam um comando GO ao servidor.

    Não use um ponto e vírgula como terminador de instrução depois de GO.

    -----------------------------------------------

    Isso esta na documentação oficial Microsoft, eu faço parte do tipo que esta traduzindo, corrigindo e implementando em cada versão novas atualizações.

    https://docs.microsoft.com/pt-br/sql/t-sql/language-elements/sql-server-utilities-statements-go?view=sql-server-ver15


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sábado, 21 de dezembro de 2019 23:12
  • não, é um valor data fixo para cada classe, porem ele teria que somar esse valor + as skills que eu declarei no inicio do código, mas oque ele esta fazendo é apenas dar SET com o data fixo

    Ok. Perguntei sobre SkillData pois se estivesse NULL o resultado de algo como
        SET @newSkillData = @newSkillData + 0xA301014700

    seria NULL.

    ---

    Como está declarada a coluna SkillData da tabela SERVER01.dbo.cabal_new_character_data?

    Nas instruções SELECT em que o valor de SkillData é assinalado para @newSkillData, é garantido que será lida uma única linha?

    ---

    Logo após a linha com o comando
        SET @convertedCurrentSkillData = CONVERT(VARCHAR(MAX), @currentSkillData, 1)

    acrescente
        SELECT @convertedCurrentSkillData;

    para saber qual é o valor de @convertedCurrentSkillData que será comparado na sequência de IF.

     


    skill data esta assim :
    [SkillData] [varbinary](1024) NOT NULL

    na parte do select, sim é garantido que lê apena 1 unica linha SKilldata, pois cada personagem só tem 1 que utiliza o varbinary "hexadecimal" e vai acumulando

    Exemplo: 0x02000100004D01014600560101480057010149009201014B008001014E008101014F00820101500


    acrescentei o select ao código, vou fazer um teste

    sábado, 21 de dezembro de 2019 23:22
  • Karylock1,

    Não é necessário o uso do GO dentro do código da sua Stored Procedure

    eu notei, depois que fui fazer umas modificações e começou a acusar erro na hora de dar executar

    obrigado, dei uma lida no link que você passou!
    sábado, 21 de dezembro de 2019 23:26
  • Ana,

    Você tem certeza do que destacou como exemplo! Eu acessei todos os links, alias os conheço e não encontrei o uso do comando GO acompanhado antes ou depois do ponto e vírgula.

    Eu não estou te criticando, estou somente fazendo uma observação, este post se relaciona com as dúvidas da Karylock1.

    Mais uma vez, não estou aqui para corrigir ou apontar o dedo, mas de forma construtiva e respeitosa, estou abordando este cenário.

    Ressalto que mais uma vez dentro do código fonte de uma Stored Procedure, Function ou Trigger o comando GO não é recomendável.

    O ponto e vírgula sim é uma questão de gosto ou boas práticas.

    Vamos direcionar nossos esforços a ajudar a Kary.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sábado, 21 de dezembro de 2019 23:26
  • Está o exemplo com ; (ponto e virgula) e GO logo depois, em vários comandos, olha os links que coloquei acima, eu vi eles horas atrás, eu fiquei olhando exemplos de vários comandos do Transact SQL.  Eu estudei o Transact SQL anos atrás.  Mas quase não uso, eu sempre olho os exemplos para eu relembrar os comandos.  Eu tenho o livro oficial.

    Livro oficial do Microsoft SQL Server 2012 e Transact-SQL


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful


    • Editado Ana Gauna sábado, 21 de dezembro de 2019 23:45
    sábado, 21 de dezembro de 2019 23:35
  • Está o exemplo com ; (ponto e virgula) e GO logo depois, em vários comandos, olha os links que coloquei acima, eu vi eles horas atrás, eu fiquei olhando exemplos de vários comandos do Transact SQL.  Eu estudei o Transact SQL anos atrás.  Mas quase não uso, eu sempre olho os exemplos para eu relembrar os comandos.  Eu tenho o livro oficial.


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

    Ana,

    Ok, ok, eu falei para você que eu acessei os links, não são todos os exemplos que estão fazendo uso do ponto e vírgula em conjunto com o GO.

    Reforço não estou te criticando, veja o exemplo abaixo, tem ponto e vírgula:

    DECLARE @myvar char(20); 
    SET @myvar = 'This is a test'; 
    SELECT top 1 @myvar FROM sys.databases;  
     

    Este outro tem, usa o ponto e vírgula e o GO:

    DECLARE @myvar char(20); 
    SET @myvar = 'This is a test'; 
    SELECT @myvar; 
    GO 

    Este outro somente o ponto e vírgula:

    SELECT EmployeeKey, LastName 
    FROM DimEmployee 
    WHERE LastName = 'Smith' ; 

    Mas repare são estrutura de código e exemplos distintos, mas nenhum esta dentro de uma Stored Procedure, vou reforçar isso.

    E ressalto mais uma vez, o comando GO não é um comando da linguagem Transact-SQL.



    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    sábado, 21 de dezembro de 2019 23:42
  • Junior,

    O comando GO está dentro do manual do Microsoft SQL, com vários exemplos, e eu sei o que eu li.

    Boa noite


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

    domingo, 22 de dezembro de 2019 00:03
  • Junior,

    O comando GO está dentro do manual do Microsoft SQL, com vários exemplos, e eu sei o que eu li.

    Boa noite


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

    Ana,

    Não vou mais tentar explicar.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    domingo, 22 de dezembro de 2019 00:18
  • karygalock1,

    para consultar as páginas do manual do Microsoft SQL do comando que quiser ver os exemplos,

    digita na busca Google o seguinte:  Microsoft Docs SQL + comando que quer consultar no manual


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

    domingo, 22 de dezembro de 2019 00:29
  • Junior,

    Eu estou estudando o Transact-SQL de novo, e o Adm Microsoft SQL Server de novo, pretendo fazer as provas de certificação em breve.  Eu vou ficar estudando no ano de 2020 esse assunto. Pretendo comprar o livro oficial novo.  Feliz Natal.

    Boa noite


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

    domingo, 22 de dezembro de 2019 00:36
  • Junior,

    Eu estou estudando o Transact-SQL de novo, e o Adm Microsoft SQL Server de novo, pretendo fazer as provas de certificação em breve.  Eu vou ficar estudando no ano de 2020 esse assunto. Pretendo comprar o livro oficial novo.  Feliz Natal.

    Boa noite


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

    Ana,

    Ok, perfeito, eu também estou sempre estudando, vamos em frente.

    Feliz Natal.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    domingo, 22 de dezembro de 2019 00:39
  • Junior,

    Notei uma coisa só agora, no código dele aquele PROCEDURE AS BEGIN está faltando o END; do final da PROCEDURE.


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

    domingo, 22 de dezembro de 2019 01:42
  • Junior,

    Notei uma coisa só agora, no código dele aquele PROCEDURE AS BEGIN está faltando o END; do final da PROCEDURE.


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

    Ana,

    Sim, é verdade.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    domingo, 22 de dezembro de 2019 01:47
  • Junior,

    Notei uma coisa só agora, no código dele aquele PROCEDURE AS BEGIN está faltando o END; do final da PROCEDURE.

    Ana,

    Sim, é verdade.


    Na verdade não esta, tem a quantidade de ends corretos na procedure e se estivesse o próprio SQL acusa um erro antes mesmo de tentar dar EXEC, mas por via das duvidas eu acrescentei mais um end e adivinha? na hora do EXC da erro, acusando erro de syntax pelo fato dele estar la sem dar fim a nenhum código!

    Mas enfim, de qualquer maneira estou buscando soluções pro meu problema, tentando reescrever o código de uma forma que ele de um search sei la... to tentando ter ideias xD

    eu agradeço a ajuda de vocês como sempre de um jeito ou de outro eu sempre aprendo algo novo!!!!!


    • Editado karygalock1 domingo, 22 de dezembro de 2019 02:23
    domingo, 22 de dezembro de 2019 02:12
  • karygalock1,

    Confere o CHARINDEX nos exemplos que vi ele se usa com SELECT 

    https://docs.microsoft.com/pt-br/sql/t-sql/functions/charindex-transact-sql?view=sql-server-ver15


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

    domingo, 22 de dezembro de 2019 04:16
  • Deleted
    domingo, 22 de dezembro de 2019 13:23
  • Junior,

    Notei uma coisa só agora, no código dele aquele PROCEDURE AS BEGIN está faltando o END; do final da PROCEDURE.

    Ana,

    Sim, é verdade.


    Na verdade não esta, tem a quantidade de ends corretos na procedure e se estivesse o próprio SQL acusa um erro antes mesmo de tentar dar EXEC, mas por via das duvidas eu acrescentei mais um end e adivinha? na hora do EXC da erro, acusando erro de syntax pelo fato dele estar la sem dar fim a nenhum código!

    Mas enfim, de qualquer maneira estou buscando soluções pro meu problema, tentando reescrever o código de uma forma que ele de um search sei la... to tentando ter ideias xD

    eu agradeço a ajuda de vocês como sempre de um jeito ou de outro eu sempre aprendo algo novo!!!!!


    Kary,

    Você poderia nos apresentar as mensagens de erros e números das linhas que estão sendo consideradas como erro?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    domingo, 22 de dezembro de 2019 14:30
  • karygalock1,

    Confere o CHARINDEX nos exemplos que vi ele se usa com SELECT 

    https://docs.microsoft.com/pt-br/sql/t-sql/functions/charindex-transact-sql?view=sql-server-ver15


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

          karygalock1, olha esse link:

          https://www.c-sharpcorner.com/blogs/how-to-check-if-a-string-contains-a-substring-in-sql-server


    Ana Gauna | Senior Business Systems Analyst | MCSE Microsoft Windows Server | Rio de Janeiro | Brazil | If I helped you, mark the answer as useful

    domingo, 22 de dezembro de 2019 15:02
  • Bom, dei uma analisada em todos os links que vcs passaram, mesmo aprendendo algumas coisas e utilizando algumas dicas e absorvendo + conhecimento, eu resolvi abordar o problema de uma forma diferente e mais simples

    eu criei uma procedure nova que faz uma verificação na skill que eu quero Exemplo (skill 100) e insere essa skill em uma tabela
    logo em seguida eu fiz uma modificação na procedura que eu postei aqui e acrescentei um exec nela no inicio do código e
    assim fazendo a procedure ter 3 partes
    a primeira ela executa a procedure de checagem, inserindo na tabela nova as skills que vão ser salvas.
    segundo ele faz toda a sequencia e troca a classe do personagem
    na terceira e ultima parte ele adiciona as skills que estão salvas tabela no personagem. Assim concluindo toda a troca de classe

    ficou meio amador na minha opinião, mas bastante funcional e de uma maneira bem simples de se resolver.

    domingo, 22 de dezembro de 2019 19:53