Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Schemabindung mit berechneter Spaltenfunktion

Es ist unmöglich, einen Index zu einer berechneten Spalte hinzuzufügen, es sei denn, er ist deterministisch.

"Deterministische Funktionen geben immer das gleiche Ergebnis zurück, wenn sie mit einem bestimmten Satz von Eingabewerten aufgerufen werden und denselben Status der Datenbank haben. Nicht deterministische Funktionen können jedes Mal, wenn sie mit einem bestimmten Satz von Eingabewerten aufgerufen werden, unterschiedliche Ergebnisse zurückgeben selbst wenn der Datenbankstatus, auf den sie zugreifen, derselbe bleibt."

Beispiel:

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

Sie müssen PERSISTED angeben für ungenaue Datentypen wie [real] und [float] , andernfalls können Sie einen Index für eine Ansicht mit berechneter Spalte frei erstellen ([dezimal] ist in Ordnung).