Especificar colunas computadas em uma tabelaSpecify Computed Columns in a Table

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Uma coluna computada é uma coluna virtual que não está fisicamente armazenada na tabela, a menos que a coluna esteja marcada como PERSISTED.A computed column is a virtual column that is not physically stored in the table, unless the column is marked PERSISTED. Uma expressão de coluna computada pode usar dados de outras colunas para calcular um valor para a coluna à qual pertence.A computed column expression can use data from other columns to calculate a value for the column to which it belongs. Você pode especificar uma expressão para uma coluna computada no SQL Server 2017SQL Server 2017 usando o SQL Server Management StudioSQL Server Management Studio ou o Transact-SQLTransact-SQL.You can specify an expression for a computed column in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL.

Neste tópicoIn This Topic

Antes de começarBefore You Begin

Limitações e restriçõesLimitations and Restrictions

  • Uma coluna computada não pode ser usada como uma definição de restrição DEFAULT ou FOREIGN KEY ou com uma definição de restrição NOT NULL.A computed column cannot be used as a DEFAULT or FOREIGN KEY constraint definition or with a NOT NULL constraint definition. Entretanto, se o valor da coluna computada for definido por uma expressão determinística e o tipo de dados do resultado for permitido em colunas de índice, uma coluna computada poderá ser usada como uma coluna de chave em um índice ou como parte de qualquer restrição PRIMARY KEY ou UNIQUE.However, if the computed column value is defined by a deterministic expression and the data type of the result is allowed in index columns, a computed column can be used as a key column in an index or as part of any PRIMARY KEY or UNIQUE constraint. 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 invocações subsequentes.For example, if the table has integer columns a and b, the computed column a + b may be indexed, but computed column a + DATEPART(dd, GETDATE()) cannot be indexed, because the value might change in subsequent invocations.
  • Uma coluna computada não pode ser o destino de uma instrução INSERT ou UPDATE.A computed column cannot be the target of an INSERT or UPDATE statement.

SegurançaSecurity

PermissõesPermissions

Exige a permissão ALTER na tabela.Requires ALTER permission on the table.

Usando o SQL Server Management StudioUsing SQL Server Management Studio

Para adicionar uma nova coluna computadaTo add a new computed column

  1. No Pesquisador de Objetos, expanda a tabela na qual você deseja adicionar a nova coluna computada.In Object Explorer, expand the table for which you want to add the new computed column. Clique com o botão direito do mouse em Colunas e selecione Nova Coluna.Right-click Columns and select New Column.

  2. Insira o nome da coluna e aceite o tipo de dados padrão (nchar(10)).Enter the column name and accept the default data type (nchar(10)). O Mecanismo de Banco de DadosDatabase Engine determina o tipo de dados da coluna computada, aplicando as regras de precedência de tipos de dados às expressões especificadas na fórmula.The Mecanismo de Banco de DadosDatabase Engine determines the data type of the computed column by applying the rules of data type precedence to the expressions specified in the formula. Por exemplo, se a fórmula referenciar uma coluna de tipo money e uma coluna de tipo int, a coluna computada será do tipo money porque esse tipo de dados tem maior precedência.For example, if the formula references a column of type money and a column of type int, the computed column will be of type money because that data type has the higher precedence. Para obter mais informações, veja Precedência de tipo de dados (Transact-SQL).For more information, see Data Type Precedence (Transact-SQL).

  3. Na guia Propriedades da Coluna , expanda a propriedade Especificação de Coluna Computada .In the Column Properties tab, expand the Computed Column Specification property.

  4. Na propriedade filho (Fórmula) , insira a expressão para essa coluna na célula de grade à direita.In the (Formula) child property, enter the expression for this column in the grid cell to the right. Por exemplo, em uma coluna SalesTotal , a fórmula que você insere pode ser SubTotal+TaxAmt+Freight, que associa o valor nessas colunas a cada linha na tabela.For example, in a SalesTotal column, the formula you enter might be SubTotal+TaxAmt+Freight, which adds the value in these columns for each row in the table.

    Importante

    Quando uma fórmula combina duas expressões de tipos de dados diferentes, as regras de precedência do tipo de dados especificam que o tipo de dados com menor precedência é convertido no tipo de dados de maior precedência.When a formula combines two expressions of different data types, the rules for data type precedence specify that the data type with the lower precedence is converted to the data type with the higher precedence. Se a conversão não for uma conversão implícita com suporte, o erro "Error validating the formula for column column_name." será retornado.If the conversion is not a supported implicit conversion, the error "Error validating the formula for column column_name." is returned. Use a função CAST ou CONVERT para resolver o conflito de tipo de dados.Use the CAST or CONVERT function to resolve the data type conflict. Por exemplo, se uma coluna de tipo nvarchar é combinada com uma coluna de tipo int, o tipo inteiro deve ser convertido em nvarchar , conforme mostrado nesta fórmula ('Prod'+CONVERT(nvarchar(23),ProductID)).For example, if a column of type nvarchar is combined with a column of type int, the integer type must be converted to nvarchar as shown in this formula ('Prod'+CONVERT(nvarchar(23),ProductID)). Para obter mais informações, veja CAST e CONVERT (Transact-SQL).For more information, see CAST and CONVERT (Transact-SQL).

  5. Indique se os dados são persistentes escolhendo Sim ou Não na lista suspensa da propriedade filho Is Persisted .Indicate whether the data is persisted by choosing Yes or No from the drop-down for the Is Persisted child property.

  6. No menu Arquivo, clique em Salvar nome da tabela.On the File menu, click Save table name.

Para adicionar uma definição de coluna computada em uma coluna existenteTo add a computed column definition to an existing column

  1. No Pesquisador de Objetos, clique com o botão direito do mouse na tabela com a coluna que você deseja alterar e expanda a pasta Colunas .In Object Explorer, right-click the table with the column for which you want to change and expand the Columns folder.
  2. Clique com o botão direito do mouse na coluna para a qual você deseja especificar uma fórmula de coluna computada e clique em Excluir.Right-click the column for which you want to specify a computed column formula and click Delete. Clique em OK.Click OK.
  3. Adicione uma nova coluna e especifique a fórmula de coluna computada seguindo o procedimento anterior para adicionar uma nova coluna computada.Add a new column and specify the computed column formula by following the previous procedure to add a new computed column.

Usando o Transact-SQLUsing Transact-SQL

Para adicionar uma coluna computada ao criar uma tabelaTo add a computed column when creating a table

O exemplo a seguir cria uma tabela com uma coluna computada que multiplica o valor da coluna QtyAvailable pelo valor da coluna UnitPrice.The following example creates a table with a computed column that multiplies the value in the QtyAvailable column times the value in the UnitPrice column.

CREATE TABLE dbo.Products
   (
      ProductID int IDENTITY (1,1) NOT NULL
      , QtyAvailable smallint
      , UnitPrice money
      , InventoryValue AS QtyAvailable * UnitPrice
    )
;
-- Insert values into the table.
INSERT INTO dbo.Products (QtyAvailable, UnitPrice)
   VALUES (25, 2.00), (10, 1.5)
;
-- Display the rows in the table.
SELECT ProductID, QtyAvailable, UnitPrice, InventoryValue
FROM dbo.Products
;

Para adicionar uma nova coluna computada em uma tabela existenteTo add a new computed column to an existing table

O exemplo a seguir adiciona uma nova coluna à tabela criada no exemplo anterior.The following example adds a new column to the table created in the previous example.

ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5)
;

Opcionalmente, adicione o argumento PERSISTED para armazenar fisicamente os valores computados na tabela:Optionally, add the PERSISTED argument to physically store the computed values in the table:

ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5) PERSISTED
;

Para transformar uma coluna existente em coluna computadaTo change an existing column to a computed column

O exemplo a seguir modifica a coluna adicionada no exemplo anterior.The following example modifies the column added in the previous example.

ALTER TABLE dbo.Products DROP COLUMN RetailValue
;
GO
ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5)
;

Para obter mais informações, veja ALTER TABLE (Transact-SQL).For more information, see ALTER TABLE (Transact-SQL).