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

  • Pergunta

  • 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
    terça-feira, 7 de outubro de 2008 12:27

Todas as Respostas

  • 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]))

     

     

    terça-feira, 7 de outubro de 2008 12:48
    Moderador
  • 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.
    terça-feira, 7 de outubro de 2008 13:05
  • 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?

    terça-feira, 7 de outubro de 2008 13:26
    Moderador
  • 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
    terça-feira, 7 de outubro de 2008 13:38
  • Não seria o caso de se criar uma trigger?

    terça-feira, 7 de outubro de 2008 14:34
  • Se não foi possivel usando o default vai ser o jeito criar uma trigger.
    terça-feira, 7 de outubro de 2008 14:55
  • 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!
    terça-feira, 7 de outubro de 2008 20:45
  • 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

    terça-feira, 7 de outubro de 2008 21:45
  • Gustado, realmente eu preciso dar update nessa coluna, como seria possivel sem ser via trigger?

     

    Obrigado,

     

    quarta-feira, 8 de outubro de 2008 01:15
  • Mariz,

     

    Seria possível sim via trigger.

     

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

     

    quarta-feira, 8 de outubro de 2008 12:06
    Moderador
  • Essa coluna é o resultado de Quantidade * Preco, e esse resultado pode ser arredondado ou truncado, depende de cada nota.

     

    Obrigado;

    quarta-feira, 8 de outubro de 2008 12:28
  • Mariz,

     

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

    quarta-feira, 8 de outubro de 2008 13:19
    Moderador
  • 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;

     

    quarta-feira, 8 de outubro de 2008 13:24
  • 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

     

     

     

     

     

    quarta-feira, 8 de outubro de 2008 13:34
    Moderador