39 votes

Sql Serveur déterministe fonction définie par l'utilisateur

J'ai la fonction définie par l'utilisateur suivante :

create function [dbo].[FullNameLastFirst]
(
    @IsPerson bit,
    @LastName nvarchar(100),
    @FirstName nvarchar(100)
)
returns nvarchar(201)
as
begin
    declare @Result nvarchar(201)
    set @Result = (case when @IsPerson = 0 then @LastName else case when @FirstName = '' then @LastName else (@LastName + ' ' + @FirstName) end end)
    return @Result
end

Je ne peux pas créer un index sur une colonne calculée en utilisant cette fonction car ce n'est pas déterministe. Quelqu'un pourrait expliquer pourquoi il n'est pas déterministe et finalement comment le modifier pour le rendre déterministe ? Merci

56voto

Martin Smith Points 174101

Vous avez juste besoin de le créer with schemabinding.

SQL Server vérifiera ensuite s'il répond ou non aux critères pour être considéré comme déterministe (ce qu'il fait car il n'accède à aucune table externe ou utilise des fonctions non déterministes telles que getdate()).

Vous pouvez vérifier qu'il a fonctionné avec

SELECT OBJECTPROPERTY(OBJECT_ID('[dbo].[FullNameLastFirst]'), 'IsDeterministic')

L'ajout de l'option de liaison de schéma à votre code d'origine fonctionne bien, mais une version légèrement plus simple serait.

CREATE FUNCTION [dbo].[FullNameLastFirst] (@IsPerson  BIT,
                                           @LastName  NVARCHAR(100),
                                           @FirstName NVARCHAR(100))
RETURNS NVARCHAR(201)
WITH SCHEMABINDING
AS
  BEGIN
      RETURN CASE
               WHEN @IsPerson = 0
                     OR @FirstName = '' THEN @LastName
               ELSE @LastName + ' ' + @FirstName
             END
  END

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X