Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Vinculação de esquema com função de coluna computada


É impossível adicionar índice em uma coluna computada, a menos que seja determinístico.

"Funções determinísticas sempre retornam o mesmo resultado sempre que são chamadas com um conjunto específico de valores de entrada e recebem o mesmo estado do banco de dados. Funções não determinísticas podem retornar resultados diferentes cada vez que são chamadas com um conjunto específico de valores de entrada mesmo que o banco de dados declare que eles acessam permanece o mesmo."

Exemplo:
CREATE FUNCTION dbo.FuncA()
RETURNS [float]
WITH SCHEMABINDING    -- required option
BEGIN
  RETURN 1.0   -- DB engine parses body, and marks this func. as 'deterministic'
END
GO

CREATE TABLE TableA (
  K int primary key clustered,
  A AS dbo.FuncA() PERSISTED    -- must be persisted
)
GO

CREATE VIEW ViewA
WITH SCHEMABINDING    -- required option
AS
  SELECT K, A FROM dbo.TableA
GO

CREATE UNIQUE CLUSTERED INDEX IDX1 ON dbo.ViewA (K, A)
GO

Você deve especificar PERSISTED para tipos de dados imprecisos como [real] e [float] , em outro caso, você pode criar livremente um índice em uma exibição com coluna computada ([decimal] será OK).