Usuário com melhor resposta
declare com update atualizando 530 linhas

Pergunta
-
Eu tenho uma tabela chamada deploc3 com 530 linhas
select depnum,local from deploc3
Eu preciso atualizar o depnum porque o mesmo está nulo . Eu fiz um declare com while
só que quando eu atualizo, todas as linhas do depnum vão para 530 !!! Alguém pode me ajudar?
desde já agradeço.
DECLARE @XT SMALLINT
SET @XT = 1
WHILE @XT <=530
BEGIN
UPDATE DEPLOC3
SET DEPNUM = @XT
BEGIN
PRINT @XT
SET @XT = @XT + 1
END
END
- Movido AndreAlvesLima terça-feira, 12 de abril de 2011 21:39 (De:Conteúdo do site MSDN)
Respostas
-
Boa Noite,
Seu UPDATE está fazendo exatamente aquilo que se propõe a fazer, ou seja, atualizar as 530 linhas 530 vezes e por isso o último número é 530. Todos terminam com o mesmo número porque você não especificou uma cláusula WHERE e o UPDATE sempre atualizará todas as 530 linhas. Como seu LOOP varre 530 vezes, o último número de todas as linhas será 530.
Você poderia explicar um pouco mais sua lógica e o que você realmente pretende ? Não estou certo, mas talvez o código abaixo o ajude:
-- Cria uma tabela com 530 registros CREATE TABLE #T (DepNum INT NULL, Nome VARCHAR(50) DEFAULT 'Algum Valor') -- Insere 530 linhas INSERT INTO #T DEFAULT VALUES GO 530 -- Atualiza as 530 linhas via WHILE (Row Based) DECLARE @i INT SET @i = 1 WHILE @i <= 530 BEGIN UPDATE TOP(1) #T SET DepNum = @i WHERE DepNum IS NULL SET @i = @i + 1 END -- Verifica se foi atualizado SELECT DepNum, Nome FROM #T -- Zera os valores UPDATE #T SET DepNum = NULL -- Atualiza tudo com um único comando (SET Based) ;WITH Res As ( SELECT DepNum, Nome, ROW_NUMBER() OVER (ORDER BY Nome ASC) As Pos FROM #T) UPDATE Res SET DepNum = Pos -- Verifica que foi atualizado SELECT DepNum, Nome FROM #T -- Mata a tabela temporária DROP TABLE #T
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar terça-feira, 12 de abril de 2011 21:59
- Marcado como Resposta Eder Costa quinta-feira, 14 de abril de 2011 14:52
Todas as Respostas
-
Prezado(a),
Estou migrando seu post para o fórum de SQL Server - Desenvolvimento Geral.
Por favor, das próximas vezes que tiver alguma dúvida relacionada a esse assunto, poste por lá.
Obrigado.
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
Boa Noite,
Seu UPDATE está fazendo exatamente aquilo que se propõe a fazer, ou seja, atualizar as 530 linhas 530 vezes e por isso o último número é 530. Todos terminam com o mesmo número porque você não especificou uma cláusula WHERE e o UPDATE sempre atualizará todas as 530 linhas. Como seu LOOP varre 530 vezes, o último número de todas as linhas será 530.
Você poderia explicar um pouco mais sua lógica e o que você realmente pretende ? Não estou certo, mas talvez o código abaixo o ajude:
-- Cria uma tabela com 530 registros CREATE TABLE #T (DepNum INT NULL, Nome VARCHAR(50) DEFAULT 'Algum Valor') -- Insere 530 linhas INSERT INTO #T DEFAULT VALUES GO 530 -- Atualiza as 530 linhas via WHILE (Row Based) DECLARE @i INT SET @i = 1 WHILE @i <= 530 BEGIN UPDATE TOP(1) #T SET DepNum = @i WHERE DepNum IS NULL SET @i = @i + 1 END -- Verifica se foi atualizado SELECT DepNum, Nome FROM #T -- Zera os valores UPDATE #T SET DepNum = NULL -- Atualiza tudo com um único comando (SET Based) ;WITH Res As ( SELECT DepNum, Nome, ROW_NUMBER() OVER (ORDER BY Nome ASC) As Pos FROM #T) UPDATE Res SET DepNum = Pos -- Verifica que foi atualizado SELECT DepNum, Nome FROM #T -- Mata a tabela temporária DROP TABLE #T
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar terça-feira, 12 de abril de 2011 21:59
- Marcado como Resposta Eder Costa quinta-feira, 14 de abril de 2011 14:52
-
-
Boa Noite Sérgio,
Sem problemas. Que bom que atendeu aos seus propósitos.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível