none
UPDATE FROM usando table variables RRS feed

  • Pergunta

  • Bom dia!

    Tenho um UPDATE a realizar numa tabela do banco de dados e necessito incluir um JOIN a outra tabela para atribuir os devidos valores nas colunas. A consulta tem a seguinte cara:

    UPDATE address
    SET    cd_user_creation = @tblIdsUsuarios.id_login_ok
    FROM   address, @tblIdsUsuarios
    WHERE  address.cd_user_creation = @tblIdsUsuarios.id_login_errado


    Até aí nenhum problema, só que a tabela desse JOIN é uma table variable... a consulta em si não tem problema, está com sintaxe correta; entretanto tenho o seguinte erro:

    Server: Msg 137, Level 15, State 2, Line 47
    Must declare the variable '@tblIdsUsuarios'.

    Entretanto a tabela está declarada corretamente! :(

    Será que o SQL Server não permite fazer UPDATES desse gênero com table variables? Testei com tabelas temporárias e funcionou, só que o desempenho degradou bastante pois são muitos registros.

    []'s
    sexta-feira, 9 de março de 2007 13:58

Respostas

  • e so colocar um alias para a var table

    UPDATE address
    SET    cd_user_creation = @vatable.id_login_ok
    FROM   address, @tblIdsUsuarios as vatable
    WHERE  address.cd_user_creation = vatable.id_login_errado

     

    mais ficaria melhor com join

    UPDATE address
    SET    cd_user_creation = @vatable.id_login_ok
    FROM   address inner join @tblIdsUsuarios as vatable on address.cd_user_creation = vatable.id_login_errado

     

     

    abs

    sexta-feira, 9 de março de 2007 14:37

Todas as Respostas

  • Marcelo,

    Realmente utilizando variável table não da, agora trabalhando com tabelas temporárias não deveria ficar tão lento.

    Isso pode estar ocorrendo por falta de índices nas tables temporárias!!!

    sexta-feira, 9 de março de 2007 14:27
  • e so colocar um alias para a var table

    UPDATE address
    SET    cd_user_creation = @vatable.id_login_ok
    FROM   address, @tblIdsUsuarios as vatable
    WHERE  address.cd_user_creation = vatable.id_login_errado

     

    mais ficaria melhor com join

    UPDATE address
    SET    cd_user_creation = @vatable.id_login_ok
    FROM   address inner join @tblIdsUsuarios as vatable on address.cd_user_creation = vatable.id_login_errado

     

     

    abs

    sexta-feira, 9 de março de 2007 14:37
  • Colla,

    Sim, colacando o alias funciona.

    Também concordo com relação a utilizar o Join, principalmente levando-se em consideração o plano de execução.

    sexta-feira, 9 de março de 2007 15:13
  • Boa tarde, pessoal! :)

    O meu xará acertou em cheio, era exatamente o que eu precisava. Sobre o desempenho, verifiquei que o índice de uma das tabelas envolvidas está incompleto. Estou trabalhando nisso agora.

    Desde já obrigado a todos! :)

    []'s
    sexta-feira, 9 de março de 2007 18:33