sql >> Databasteknik >  >> RDS >> Sqlserver

Schemabindning med beräknad kolumnfunktion

Det är omöjligt att lägga till index på en beräknad kolumn, om det inte är deterministiskt.

"Deterministiska funktioner returnerar alltid samma resultat varje gång de anropas med en specifik uppsättning indatavärden och ges samma tillstånd i databasen. Icketerministiska funktioner kan returnera olika resultat varje gång de anropas med en specifik uppsättning indatavärden även om databasen anger att de åtkomst förblir densamma."

Exempel:

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

Du måste ange PERSISTED för oprecisa datatyper som [real] och [float] , i andra fall kan du fritt skapa ett index på en vy med beräknad kolumn ([decimal] kommer att vara OK).




  1. Hämta bara Datum från gruppering i välj från kolumnen DateTime i SQL Server

  2. Hur sparar jag MySQL-frågeutdata till excel- eller .txt-fil?

  3. Hämta en kolumns namn från dess ID i SQL Server:COL_NAME()

  4. Konvertera .sdf-databas till .mdf-databas