none
UPDATE só altera o ultimo elemento que encontra RRS feed

  • Pergunta

  • nao consegui intitular muito bem, mas é o seguinte, estou estudando T-SQL, começando a dar os primeiros passos, fiz um código que verifica o level do jogador, seta o level dele para 1, e da uma pontuação pra ele, e reseta os status dele, 

    o código é o seguinte

    declare @USER varchar(50),
    		@lvl int,
    		@RESETS int,
    		@PONTOS int,
    		@STR int,
    		@AGI int,
    		@VIT int,
    		@ENE int,
    		@RESPONTO int;
    		
    		
    select @lvl = 1
    select @AGI = 25
    select @ENE = 25
    select @STR = 25
    select @VIT = 25
    select @RESPONTO = 300;
    BEGIN TRY
    SELECT @USER = USERNAME FROM dbo.Usua WHERE LVL > 299; -- AQUI ESTÁ O PROBLEMA
    SELECT @RESETS = RESETS, @PONTOS = PONTOS FROM dbo.Usua WHERE @USER = USERNAME;
    select @RESETS = @RESETS + 1
    select @PONTOS = @PONTOS + (@RESPONTO * @RESETS);
    print @PONTOS;
    UPDATE Usua SET RESETS = @RESETS WHERE USERNAME = @USER;
    UPDATE Usua SET LVL = @lvl WHERE USERNAME = @USER;
    UPDATE Usua SET STR = @STR WHERE USERNAME = @USER;
    UPDATE Usua SET DEX = @AGI WHERE USERNAME = @USER;
    UPDATE Usua SET VIT = @VIT WHERE USERNAME = @USER;
    UPDATE Usua SET ENE = @ENE WHERE USERNAME = @USER;
    UPDATE Usua SET PONTOS = @PONTOS WHERE USERNAME = @USER;
    
    END TRY
    BEGIN CATCH
    print 'nao foi possivel restar';
    END CATCH

    só que nao sei como faço uma especie de array, para que adicione todos os usuarios que chegaram no level 300 e resete os status de todos em uma só execução, ele pega so o último da tabela

    valeu pessoa, abraço 


    domingo, 13 de janeiro de 2013 16:56

Respostas

  • Olá,

    O problema está em que apenas é retornado 1 ID de utilizador, quando o que parece que precisas é fazer isso para vários utilizadores.

    Assim, sugeria usares uma variável do tipo tabela ou tabela temporária. Vou apresentar uma possível solução usando variável do tipo tabela:


    -- Aqui é feita a declaração da variável do tipo tabela:
    DECLARE @tabela TABLE (USERNAME VARCHAR(50), resets INT, pontos INT);
    
    BEGIN TRY
    	-- faz o insert dos utilizadores, resets e pontos actuais para a variável:
    	INSERT INTO @tabela
    		SELECT USERNAME, RESETS + 1, PONTOS FROM dbo.Usua WHERE LVL > 299;
    
    	-- Os novos pontos são calculados e actualizados na variável
    	UPDATE @tabela
    		SET PONTOS = PONTOS + (300 * RESETS)
    
    	-- Em vez de teres muitos updates, passas a ter só 1 update em que são actualizados vários campos a partir da variável que contém a tabela ;)
    	UPDATE Usua SET
    		Usua.RESETS = Temp.RESETS,
    		LVL = 1,
    		STR = 25,
    		DEX = 25,
    		VIT = 25,
    		ENE = 25,
    		Usua.PONTOS = Temp.PONTOS
    	FROM @tabela Temp
    	WHERE Usua.USERNAME = Temp.USERNAME
    END TRY
    BEGIN CATCH
    	PRINT 'nao foi possivel restar';
    END CATCH

    Espero ter ajudado.

    Melhores Cumprimentos,
    Pedro Martins
    Portugal

    segunda-feira, 14 de janeiro de 2013 01:04

Todas as Respostas

  • Olá,

    O problema está em que apenas é retornado 1 ID de utilizador, quando o que parece que precisas é fazer isso para vários utilizadores.

    Assim, sugeria usares uma variável do tipo tabela ou tabela temporária. Vou apresentar uma possível solução usando variável do tipo tabela:


    -- Aqui é feita a declaração da variável do tipo tabela:
    DECLARE @tabela TABLE (USERNAME VARCHAR(50), resets INT, pontos INT);
    
    BEGIN TRY
    	-- faz o insert dos utilizadores, resets e pontos actuais para a variável:
    	INSERT INTO @tabela
    		SELECT USERNAME, RESETS + 1, PONTOS FROM dbo.Usua WHERE LVL > 299;
    
    	-- Os novos pontos são calculados e actualizados na variável
    	UPDATE @tabela
    		SET PONTOS = PONTOS + (300 * RESETS)
    
    	-- Em vez de teres muitos updates, passas a ter só 1 update em que são actualizados vários campos a partir da variável que contém a tabela ;)
    	UPDATE Usua SET
    		Usua.RESETS = Temp.RESETS,
    		LVL = 1,
    		STR = 25,
    		DEX = 25,
    		VIT = 25,
    		ENE = 25,
    		Usua.PONTOS = Temp.PONTOS
    	FROM @tabela Temp
    	WHERE Usua.USERNAME = Temp.USERNAME
    END TRY
    BEGIN CATCH
    	PRINT 'nao foi possivel restar';
    END CATCH

    Espero ter ajudado.

    Melhores Cumprimentos,
    Pedro Martins
    Portugal

    segunda-feira, 14 de janeiro de 2013 01:04
  • valeu cara

    deixa eu ver se entendi.

    voce criou uma tabela temporária, depois inseriu TODOS os os usuários com level maior que 299 para a tabela temporária, depois pegou os dados de volta já modificados?

    mas fiquei com uma duvida, por que dessa forma passa todos os usuários com level maior que 299 e do meu modo passa apenas o ultimo?

    estava pensando em utilizar o COUNT(*) para contar quantos usuários com level maior que 299 tem, para depois fazer um FOR para selecionar e modificar um a um

    mas ainda nao testei


    • Editado Yuri Schmitz terça-feira, 15 de janeiro de 2013 21:15
    terça-feira, 15 de janeiro de 2013 21:10