none
Update com a cláusula TOP RRS feed

  • Pergunta

  •  

    Galera!!

     

    Estou efetuando um UPDATE porem gostaria de saber se é possível efetuar um UPDATE TOP(5) no SQL 2000. Abaixo, envio a consulta que estou tentando efetuar.Alguem sabe com posso resolver este caso?

     

     

    UPDATE TOP (5) PGO_GVT_DESP_DESPACHADOS1
    SET PGO_GVT_DESP_DESPACHADOS1.TECNICO = PGO_GVT_DESP_DESPACHADOS_RETORNO3.MATRICULA,
    PGO_GVT_DESP_DESPACHADOS1.STATUS='DESPACHADO'
    FROM PGO_GVT_DESP_DESPACHADOS1,PGO_GVT_DESP_DESPACHADOS_RETORNO3
    WHERE PGO_GVT_DESP_DESPACHADOS1.ESTACAO = PGO_GVT_DESP_DESPACHADOS_RETORNO3.ARD
    AND PGO_GVT_DESP_DESPACHADOS1.STATUS IS NULL
    AND PGO_GVT_DESP_DESPACHADOS1.TECNICO IS NULL

    terça-feira, 26 de fevereiro de 2008 13:34

Todas as Respostas

  • Bom Dia Transfer,

     

    Infelizmente o SQL Server 2000 não aceita a utilização de TOP em instruções de UPDATE (apenas o 2005 introduziu essa possibilidade). O SQL Server 2000 também não aceita a construção TOP (N) apenas TOP N e o N tem que ser um valor informado (impossibilitando uma variável).

     

    Você terá que fazer um cursor para ler e disparar os updates individualmente ou utilizar CURRENT_OF na cláusula WHERE para que o cursor atualize diretamente o registro.

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 26 de fevereiro de 2008 13:55
  • Transfer,

     

    Realmente o Gustavo esta certo, no SQL Server 2000 isso terá que ser feito no braço.

    terça-feira, 26 de fevereiro de 2008 16:40
  • no sql 2005 é possivel?
    sexta-feira, 14 de novembro de 2008 14:32
  • Boa Tarde,

     

    Sim. No 2005 é possível.

     

    [ ]s,

     

    Gustavo

     

    sexta-feira, 14 de novembro de 2008 15:17
  • Olá,

     

    Sim, a partir do SQL Server 2005 já é possível executar um INSERT, UPDATE ou DELETE, usando a cláusula TOP.

     

    Para as versões 6.5, 7 e 2000, você pode usar a solução abaixo, através da opção ROWCOUNT.

     

    O único problema é que você não pode usar ORDER BY em um UPDATE (ou INSERT, ou DELETE), logo o ROWCOUNT vai respeitar a ordenação física das tabelas utilizadas no join.

     

    Code Snippet

     


    /* Monta o cenário
     */
    CREATE TABLE Tabela1 (ID INT, VALOR INT)
    INSERT INTO Tabela1 VALUES (1, 10)
    INSERT INTO Tabela1 VALUES (2, 20)
    INSERT INTO Tabela1 VALUES (3, 30)
    INSERT INTO Tabela1 VALUES (4, 40)
    INSERT INTO Tabela1 VALUES (5, 50)

     

    CREATE TABLE Tabela2 (ID INT)
    INSERT INTO Tabela2 VALUES (1)
    INSERT INTO Tabela2 VALUES (2)
    INSERT INTO Tabela2 VALUES (3)
    INSERT INTO Tabela2 VALUES (4)
    INSERT INTO Tabela2 VALUES (5)

     

    /* Seta o ROWCOUNT para a quantidade de registros desejada.
     * Qualquer statement executado daqui para baixo, usará esta
     * quantidade como padrão.
     */
    SET ROWCOUNT 3

     

    /* Update
     */
    UPDATE Tabela1
    SET ID = 10
    FROM Tabela1 T1
    INNER JOIN Tabela2 T2
    ON T1.ID = T2.ID

     

    /* Retorna o ROWCOUNT ao estado normal
     **/
    SET ROWCOUNT 0

     

    /* Resultado
     */
    SELECT * FROM Tabela1


     

     

     

    Qualquer dúvida, é só falar.

     

    Um abraço,

    Raul Santos

    sexta-feira, 14 de novembro de 2008 15:24