Usuário com melhor resposta
UPDATE só altera o ultimo elemento que encontra

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
- Editado Yuri Schmitz domingo, 13 de janeiro de 2013 17:03
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
- Sugerido como Resposta Marcus Vinícius BittencourtMVP segunda-feira, 14 de janeiro de 2013 16:44
- Marcado como Resposta Yuri Schmitz terça-feira, 5 de fevereiro de 2013 11:20
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
- Sugerido como Resposta Marcus Vinícius BittencourtMVP segunda-feira, 14 de janeiro de 2013 16:44
- Marcado como Resposta Yuri Schmitz terça-feira, 5 de fevereiro de 2013 11:20
-
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