quarta-feira, 6 de março de 2013

Variável Decimal no SSIS 2012

Já faz alguns dias que eu estou andando de mão dada com o Integration Services 2012, gravando uma série de módulos para um treinamento completo de SSIS. Em breve vocês poderão ver as publicações nos treinamentos on-demand (http://www.srnimbus.com.br/calendario/turmas/treinamentos-on-demand/).
Uma questão interessante que destaquei em um dos vídeos é a variável do tipo Decimal, que não existia na interface do SSIS 2008 e está presente no SSIS 2012. Utilizando como base os testes que realizei, a não definição correta das características dessa variável pode trazer efeitos colaterais indesejados para seus pacotes.
Vou descrever alguns testes para que você possa simular no seu ambiente:
1.       Adicionar uma variável do tipo Double chamada vDouble (criativo, não?) ao pacote.
2.       Adicionar uma expression task com a seguinte expressão: @[User::vDouble] = 43 / 3
a.       Analisando o valor da variável após a expressão: 14
b.      Para termos um valor inteiro como resultado da divisão é porque estamos tratando dois inteiros como divisor e dividendo, então pela precedência dos tipos o resultado também é um valor inteiro.

3.       Alterar a expression task com a seguinte expressão: @[User::vDouble] = ((DT_DECIMAL, 4) 43) / 3
a.       Notem que estou fazendo a conversão do número 43 para DECIMAL com escala 4. No SSIS o tipo decimal possui precisão 29, diferente do tipo DT_NUMERIC (usando no pipeline) onde você pode definir até 38 como precisão.
b.      Analisando o valor da variável após a expressão: 14.3333333333
c.       Agora sim, o valor resultante possui casa decimal pelo tipo resultado ser um decimal e a variável um ponto flutuante.

4.       Adicionar uma variável do tipo Decimal chamada vDecimal ao pacote.
5.       Adicionar uma expression task com a seguinte expressão: @[User:: vDecimal] = 43 / 3
a.       Analisando o valor da variável após a expressão: 14
b.      Para termos um valor inteiro como resultado da divisão é porque estamos tratando dois inteiros como divisor e dividendo, então pela precedência dos tipos o resultado também é um valor inteiro.

6.       Alterar a expression task com a seguinte expressão: @[User:: vDecimal] = ((DT_DECIMAL, 4) 43) / 3
a.       Notem que estou fazendo a conversão do número 43 para DECIMAL com escala 4. No SSIS o tipo decimal possui precisão 29, diferente do tipo DT_NUMERIC (usando no pipeline) onde você pode definir até 38 como precisão.
b.      Analisando o valor da variável após a expressão: 14
c.       É aqui que o está o pequeno detalhe, o valor default para a variável decimal é 0, então o SSIS infere o tipo DECIMAL(29, 0). Então por padrão você NÃO vai ver casas decimais para a sua variável!

7.       Alterar o valor default da variável vDecimal para 0.01
a.       Analisando o valor da variável após a expressão que faz o cast, temos: 14.33
b.      Como você definiu o valor default para a variável como 0.01, então o SSIS infere o tipo DECIMAL(29, 2).

8.       Alterar o valor default da variável vDecimal para 0.0001
a.       Analisando o valor da variável após a expressão que faz o cast, temos: 14.3333
b.      Como você definiu o valor default para a variável como 0.0001, então o SSIS infere o tipo DECIMAL(29, 4).

9.       Alterar o valor default da variável vDecimal para 0.0000
a.       Analisando o valor da variável após a expressão que faz o cast, temos: 14
b.      Como você definiu o valor default para a variável como 0.0000, então o SSIS considerou o valor zero e infere o tipo DECIMAL(29, 0).
Isto é, se você quiser um decimal de 4 casas após a virgula e que no início do pacote o valor seja zero, você precisa definir o valor inicial como 0.0001 e no início do pacote alterar o valor para zero. Bem chato esse detalhe.
Eu revisei os novos livros do SSIS 2012 e nenhum parece tratar esse assunto, então resolvi colocar aqui para que seja validado com todos vocês (qualquer ponto que passou despercebido me avise!). Espero que você tenha cuidado e não introduza efeitos colaterais indesejados no seu pacote ao utilizar variáveis do tipo Decimal.
Em tempo, eu abri uma entrada no Connect sobre essa questão (https://connect.microsoft.com/SQLServer/feedback/details/780244/add-scale-property-to-a-decimal-variable-in-ssis, vamos ver se a Microsoft se pronuncia a respeito disso e quem sabe, de forma favorável.
Abraços

Nenhum comentário:

Postar um comentário