none
Como criar um default com base em outras colunas da tabela?

    Question

  • Tenho uma tabela de itens, que tem as colunas:

    QUANTIDADE
    PRECO
    TOTAL_ITEM

    Quero criar um default para coluna TOTAL_ITEM default (QUANTIDADE*PRECO), porem gera erro informando que não
    posso utilizar as colunas QUANTIDADE, PRECO.

    É possivel criar um default dessa forma?

    Lembrando que por motivos não relacionados aqui os valores devem ser persistidos, não pode ser coluna do tipo computed.

    Obrigado.

    At.
    Ricardo Lima
    Tuesday, October 07, 2008 12:27 PM

All replies

  • Mariz,

     

    Na verdade este tipo de situação não é criada com constraints default, o que você esta querendo é armazenar o valor de um cálculo entre dois campos em uma coluna.

     

    Neste caso seria o caso de criar este campo como se fosse uma coluna calculada, veja abaixo o código de exemplo:

     

    Code Snippet

    Create Table #Teste

    (Quantidade Int,

    Preco Float,

    TotalItem As ([Quantidade] * [Preco]))

     

     

    Tuesday, October 07, 2008 12:48 PM
    Moderator
  • Junior no meu caso não funciona, eu preciso conseguir dar update na coluna, por isso falei que o valor deve ser armazenado.

    Essa forma que voçê sugeriou não é possivel dar update da coluna TotalItem.

    Obrigado.
    Tuesday, October 07, 2008 1:05 PM
  • Mariz,

     

    Você não informou sobre o Update, mas podemos fazer então deste jeito:

     

    Code Snippet

    Create Table SuaTable

     (Quantidade Int,

      Preco Float,

      TotalItem)

     

    Update SuaTable

    Set TotalItem = (Quantidade * Preco)

     

     

     

     

    Agora você deseja fazer este Update em qual momento?

    Tuesday, October 07, 2008 1:26 PM
    Moderator
  • Tem varios pontos no sistema que inserem registros nessa tabela, esse camp sempre existiu mas era do tipo Computed era justamente o que vc sugeriu TotalItem As (Preco * Quantidade), por motimos de arredonamento/truncamento vamos ter que armazenar esses valores, no sistema nos lugares onde gravam dados na tebela ja vão armazenar tembém  TotalItem eu quero colocar o default caso algum lugar nos sistema não grave esse valor o banco grabe automáticamente.

    At.
    Ricardo Lima
    Tuesday, October 07, 2008 1:38 PM
  • Não seria o caso de se criar uma trigger?

    Tuesday, October 07, 2008 2:34 PM
  • Se não foi possivel usando o default vai ser o jeito criar uma trigger.
    Tuesday, October 07, 2008 2:55 PM
  • Pois é rlMariz,
    Pela forma que você deseja o SQL Server ainda não tem suporte. Coluna computada que seja atualizavel!!!!
    Acredito que a solução esteja na trigger mesmo!


    Espero ter ajudado ou pelo menos tirado sua duvida!
    Tuesday, October 07, 2008 8:45 PM
  • Boa Tarde,

     

    Se você tem o receio de por motivos de arrendondamento houver problemas (afinal o float pode variar de acordo com o processador), você pode continuar a usar a coluna calculada, mas marque-a como persisted. Dessa forma, uma vez que seu valor foi persistido (mesmo sendo calculado) não haverá mais problemas de arredondamento.

     

    Acredito que seja melhor do que utilizar uma trigger. Afinal, a coluna calculada irá sempre garantir o cálculo enquanto a trigger não (a menos que você também monte uma trigger de update).

     

    Em todo caso, se essa abordagem não lhe é suficiente e você realmente precisa atualizar uma coluna calculável existem outros meios de fazê-lo (não precisa ser necessariamente com uma trigger), mas overhead sempre existirá. Acredito que persistir o valor da coluna Computed seja a melhor opção.

     

    [ ]s,

     

    Gustavo

    Tuesday, October 07, 2008 9:45 PM
  • Gustado, realmente eu preciso dar update nessa coluna, como seria possivel sem ser via trigger?

     

    Obrigado,

     

    Wednesday, October 08, 2008 1:15 AM
  • Mariz,

     

    Seria possível sim via trigger.

     

    Mas deixa eu entender uma coisa, como é a sua necessidade para realizar o Update?

     

    Wednesday, October 08, 2008 12:06 PM
    Moderator
  • Essa coluna é o resultado de Quantidade * Preco, e esse resultado pode ser arredondado ou truncado, depende de cada nota.

     

    Obrigado;

    Wednesday, October 08, 2008 12:28 PM
  • Mariz,

     

    Então todas as vezes que esta tables sofrer algum tipo de manipulação de dados esta coluna TotalItem deverá ser atualizada?

    Wednesday, October 08, 2008 1:19 PM
    Moderator
  • Sim, Eu quero criar um calculo automático somente por garantia, pois tem pontos no sistema fazer inserção de registros na tabela, caso esqueça de fazer a atualziação em algum ponto o proprio sql server vai fazer o calculo na coluna;

     

    Wednesday, October 08, 2008 1:24 PM
  • Mariz,

     

    Veja este exemplo:

     

    Code Snippet

    Create Trigger T_AtualizarValores

    On SuaTable

    For Insert, Update

     Begin

     

      Update SuaTable

      Set TotalItem = Quantidade * Preco

      From SuaTable Inner Join Inserted

      Where ID = Inserted.ID

     

    End

     

     

     

     

     

    Wednesday, October 08, 2008 1:34 PM
    Moderator