none
declare com update atualizando 530 linhas RRS feed

  • 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)
    terça-feira, 12 de abril de 2011 20:50

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
    terça-feira, 12 de abril de 2011 21:58

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
    terça-feira, 12 de abril de 2011 21:38
  • 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
    terça-feira, 12 de abril de 2011 21:58
  • MEU CARO  GUSTAVO desculpe a demora; desde já agradeço pela sua paciência em me ajudar a resolver este pequeno problema.Ficou perfeito !!!!  , fique com Deus!! 
    quinta-feira, 21 de abril de 2011 01:33
  • 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
    quinta-feira, 21 de abril de 2011 03:09