Tipos de dados do Integration Services em expressões

Aplica-se a:SQL Server SSIS Integration Runtime no Azure Data Factory

O avaliador de expressão usa tipos de dados do Integration Services. Quando dados são inseridos pela primeira vez em um fluxo de dados em um pacote do Integration Services, o mecanismo de fluxo de dados converte todos os dados de coluna para um tipo de dados do Integration Services, e os dados da coluna que uma expressão usa já têm um tipo de dados do Integration Services. As expressões usadas nas transformações Divisão Condicional e Coluna Derivada podem fazer referência a colunas porque elas fazem parte de um fluxo de dados que inclui dados de coluna.

Variáveis

Expressões também podem usar variáveis. As variáveis têm um tipo de dados Variant e o avaliador de expressão converte o tipo de dados de uma variável a partir do subtipo Variant para um tipo de dados do Integration Services antes de avaliar a expressão. As variáveis podem usar só um subconjunto dos tipos de dados do Integration Services. Por exemplo, uma variável não pode usar um tipo de dados BLOB (Bloco do objeto binário grande).

Para obter mais informações sobre tipos de dados do Integration Services e o mapeamento de tipos de dados Variant para tipos de dados do Integration Services, confira Tipos de dados dos Integration Services.

Literais

Além disso, expressões podem incluir literais de cadeia de caracteres, Boolianos e numéricos. Para obter mais informações sobre como converter literais numéricos para tipos de dados do Integration Services, confira Literais (SSIS).

Cadeias de caracteres

Você pode usar DT_STR ou DT_WSTR como o tipo de retorno de uma expressão. Dentro de uma expressão, no entanto, apenas DT_WSTR tem suporte e valores DT_STR são convertidos em valores DT_WSTR. Esse comportamento tem várias implicações quando você está escrevendo uma expressão.

  • Dentro de uma expressão, use NULL(DT_WSTR, ...) em vez de NULL(DT_STR, ...). Para obter mais informações sobre essa função, confira NULL (Expressão SSIS).

  • Dentro de uma expressão, você só pode usar a função CAST para converter um valor para o tipo DT_STR na raiz da expressão - ou seja, quando você estiver retornando o resultado final da expressão. Caso contrário, use o tipo DT_WSTR dentro na expressão.

Considere as expressões na captura de tela a seguir.

String data types in SSIS expressions

  1. A primeira expressão é executada sem erro, porque a função NULL(DT_STR, ...) está no nível raiz da expressão.

  2. A segunda expressão é executada sem erro, pois ela usa NULL (DT_WSTR, ...).

  3. A terceira expressão gera um erro porque usa NULL(DT_STR, ...) dentro da expressão.

  4. A quarta expressão é executada sem erro porque converte o resultado de NULL(DT_STR, ...) dentro da expressão.

    O avaliador de expressão trata dessa conversão de modo inteligente e converte em DT_WSTR, não em DT_STR, porque reconhece que a operação não está no nível raiz da expressão.

Os exemplos a seguir demonstram os efeitos da conversão.

Casting strings in SSIS expressions

  1. Na primeira expressão, a conversão não é no nível raiz da expressão. O avaliador de expressão trata dessa conversão de modo inteligente e converte em DT_WSTR, não em DT_STR. A expressão retorna DT_WSTR.

  2. Na segunda expressão, a conversão é no nível raiz da expressão. A expressão retorna DT_STR.

Conversão implícita de dados

Uma conversão implícita de um tipo de dados ocorre quando o avaliador de expressão converte automaticamente os dados de um tipo de dados para outro. Por exemplo, se smallint é comparado com int, smallint é convertido implicitamente em int antes da execução da comparação.

O avaliador de expressão não pode executar conversão de dados implícita quando os argumentos e operandos tiverem tipos de dados incompatíveis. Além disso, o avaliador de expressão não pode converter nenhum valor implicitamente para um Booliano. Em vez disso, os argumentos e operandos devem ser convertidos explicitamente usando o operador cast. Para obter mais informações, confira Cast (Expressão do SSIS).

O diagrama a seguir mostra o tipo de resultado de conversões implícitas de operações BINARY. A intersecção da coluna e da linha nesta tabela é o tipo de resultado de uma operação binário com operandos dos tipos à esquerda (De) e à direita (Para).

Implicit data type conversion between data types

A intersecção de um inteiro assinado e não assinado é um inteiro assinado potencialmente maior do que o argumento.

Operadores comparam cadeias de caracteres, datas, Boolianos e outros tipos de dados. Antes de um operador comparar dois valores, o avaliador de expressão executa certas conversões implícitas. O avaliador de expressão sempre converte os literais de cadeia de caracteres para o tipo de dados DT_WSTR e converte os literais Boolianos para o tipo de dados DT_BOOL. O avaliador de expressão interpreta todos os valores incluídos entre aspas como cadeias de caracteres. Os literais numéricos são convertidos para um dos tipos de dados numéricos do Integration Services.

Observação

Valores Boolianos são valores lógicos, não números. Embora os valores Boolianos possam ser exibidos como números em alguns ambientes, eles não são armazenados como números, e várias linguagens de programação representam valores Boolianos como valores numéricos de modos diferentes, como faz os métodos do .NET Framework.

Por exemplo, as funções de conversão disponíveis no Visual Basic convertem True para -1; no entanto, o método System.Convert.ToInt32 no .NET Framework converte True para +1. A Linguagem de expressão do Integration Services converte True para -1.

Para evitar erros ou resultados inesperados, você não deve gravar códigos que contem com valores numéricos específicos para True e False. Onde for possível, você deve restringir o uso de variáveis boolianas aos valores lógicos para os quais elas são projetados.

Para obter mais informações, consulte estes tópicos:

Uma função que usa um único argumento retorna um resultado com o mesmo tipo de dados que o argumento, com as seguintes exceções:

  • DAY, MONTH e YEAR aceitam uma data e retornam um resultado inteiro (DT_I4).

  • ISNULL aceita uma expressão de qualquer tipo de dados SSIS e retorna um resultado Booliano (DT_BOOL).

  • SQUARE e SQRT aceitam uma expressão numérica e retornam um resultado numérico (DT_R8) não integral.

Se os argumentos tiverem o mesmo tipo de dados, o resultado será daquele tipo. A única exceção é o resultado de uma operação binária em dois valores com o tipo de dados DT_DECIMAL, que retorna um resultado com o tipo de dados DT_NUMERIC.

Requisitos para obter dados usados em expressões

O avaliador de expressão dá suporte a todos os tipos de dados do Integration Services. Porém, dependendo da operação ou da função, os operandos e os argumentos requerem certos tipos de dados. O avaliador de expressão impõe os seguintes requisitos de tipo de dados em dados usados em expressões:

  • Operandos usados em operações lógicas devem ser avaliados como um Booliano. Por exemplo, ColumnA > 1&&ColumnB < 2.

  • Operandos usados em operações matemáticas devem ser avaliados como um valor numérico. Por exemplo, 23.75 * 4.

  • Operandos usados em operações de comparação, como operações lógicas e de igualdade, devem ser avaliados como tipos de dados compatíveis.

    Por exemplo, uma das expressões no exemplo a seguir usa o tipo de dados de DT_DBTIMESTAMPOFFSET:

    (DT_DBTIMESTAMPOFFSET,3) "1999-10-11 20:34:52.123 -3:30" != (DT_DBDATE)"1999-10-12"

    O sistema converte a expressão, (DT_DBDATE)"1999-10-12", para DT_DBTIMESTAMPOFFSET. O exemplo é avaliado como TRUE porque a expressão convertida se torna "1999-10-12 00:00:00.000 +00:00", que não é igual ao valor de outra expressão, (DT_DBTIMESTAMPOFFSET,3) "1999-10-11 20:34:52.123 -3:30".

  • Argumentos passados para as funções matemáticas devem ser avaliados como um tipo de dados numérico. Dependendo da função ou operação, um tipo de dados numérico específico pode ser exigido. Por exemplo, a função HEX requer um inteiro assinado ou não assinado.

  • Argumentos passados para funções da cadeia de caracteres devem ser avaliados como a um tipo de dados de caractere: DT_STR ou DT_WSTR. Por exemplo, UPPER ("flor"). Algumas funções da cadeia de caracteres, como SUBSTRING, requerer argumentos inteiros adicionais para a posição inicial e o comprimento da cadeia de caracteres.

  • Argumentos passados para as funções de data e hora devem ser avaliados como uma data válida. Por exemplo, DAY(GETDATE()). Algumas funções, como DATEADD, exigem um argumento inteiro adicional para o número de dias que a função adiciona a uma data.

As operações que combinam um inteiro de oito bytes não assinado e um inteiro assinado exigem uma conversão explícita para esclarecer o formato do resultado. Para obter mais informações, confira Cast (Expressão do SSIS).

Resultados de muitas operações e funções predeterminaram tipos de dados. Esse pode ser o tipo de dados do argumento ou o tipo de dados para o qual o avaliador de expressão converte o resultado. Por exemplo, o resultado de um operador OR lógico (||) é sempre um Booliano, o resultado da função ABS é o tipo de dados numérico do argumento, e o resultado da multiplicação é o menor tipo de dados numérico que pode manter o resultado sem perda. Para obter mais informações sobre os tipos de dados de resultados, confira Expressão de Operadores (SSIS) e Expressão de Funções (SSIS).

Usar uma expressão em um componente de fluxo de dados