Colunas computadas

Uma coluna é computada de uma expressão que pode usar outras colunas na mesma tabela. A expressão pode ser um nome de coluna não-computada, uma constante, uma função e qualquer combinação dessas conectada por um ou mais operadores. A expressão não pode ser uma subconsulta.

Por exemplo, no banco de dados de exemplo AdventureWorks, a coluna TotalDue da tabela Sales.SalesOrderHeader tem a definição: TotalDue AS Subtotal + TaxAmt + Frete.

A menos que especificado ao contrário, colunas computadas são colunas virtuais que não são armazenadas fisicamente na tabela. Seus valores são calculados novamente sempre que sejam referenciados em uma consulta. O Mecanismo de Banco de Dados usa a palavra-chave PERSISTED nas instruções CREATE TABLE e ALTER TABLE para armazenar fisicamente as colunas computadas em uma tabela. Seus valores são atualizados quando as colunas que fazem parte de seus cálculos são alteradas. Marcando uma coluna computada como PERSISTED, é possível criar um índice em coluna computada que é determinístico mas não preciso. Além disso, se uma coluna computada faz referência a uma função CLR, o Mecanismo de Banco de Dados não pode verificar se a função é de fato determinística. Neste caso, a coluna computada deve ser PERSISTED de forma que os índices sejam criados nela. Para obter mais informações, consulte Criando índices em colunas computadas.

ObservaçãoObservação

Qualquer coluna computada usada como colunas de particionamento de uma tabela particionada deve ser explicitamente persistente.

As colunas computadas podem ser usadas em listas de seleção, cláusulas WHERE, cláusulas ORDER BY, ou qualquer outro local no qual expressões regulares podem ser usadas com as seguintes exceções:

  • As colunas computadas usadas como restrições CHECK, FOREIGN KEY ou NOT NULL devem ser marcadas como PERSISTED. Uma coluna computada pode ser usada como uma coluna de chave em um índice ou como parte de uma restrição PRIMARY KEY ou UNIQUE se o seu valor for definido por uma expressão determinística e o tipo de dado do resultado for permitido nas colunas de índice.

    Por exemplo, se a tabela tiver colunas de inteiros a e b, a coluna computada a + b poderá ser indexada, mas a coluna computada a + DATEPART(dd, GETDATE()) não poderá ser indexada, pois o valor pode ser alterado em chamadas subseqüentes.

  • Uma coluna computada não pode ser o destino de uma instrução INSERT ou UPDATE.

O Mecanismo de Banco de Dados determina automaticamente a nulidade das colunas computadas baseado em expressões usadas. O resultado da maioria das expressões será considerado nulo mesmo se somente colunas não nulas estejam presentes, pois a falta de fluxo ou excesso de fluxo produzirá resultados nulos também. Use a função COLUMNPROPERTY com a propriedade AllowsNull para investigar a nulidade de qualquer coluna computada em uma tabela. Uma expressão que permite valor nulo pode se tornar uma expressão não nula especificando ISNULL(check_expression**,**constant), no qual o constant é um valor não nulo substituído por um resultado nulo.