26

Aşağıdaki kullanıcı tanımlı işlevi vardır:SQL Server deterministik kullanıcı tanımlı fonksiyon

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 

Ben deterministik değil neden bu fonksiyonu kullanarak hesaplanmış bir sütun Index oluşturamazsınız. Birisi neden deterministik ve niçin determinist hale getirmek için nasıl değiştirileceğini açıklayamadı mı? Teşekkürler

cevap

40

Yalnızca with schemabinding ürününü oluşturmanız gerekiyor.

Daha sonra SQL Server, deterministik olarak kabul edilme ölçütlerini karşılayıp karşılamadığını (herhangi bir dış tabloya erişmediği veya getdate() gibi deterministik olmayan işlevleri kullandığı gibi) doğrulayacaktır.

Bunu

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

orijinal koduna SCHEMABINDING seçeneği ekleme ile çalıştı doğrulamak çalışıyor ama biraz daha basit versiyonu olacağını olabilir.

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 
+1

ile kullanıcı tanımlı işlevi ilan etmek gerekir. Ayrıca, tablomdan bahseden bir Görünümüm var. Sanırım aynı sütunda bir dizin oluşturmak için de görünümde SchemaBinding belirtmek zorundayım. Bununla ilgili olarak, temel tablomuz hesaplanmış sütun üzerinde bir İndeks olarak ise, Görünümde başka bir Dizin oluşturulsun mu? – opaera

+0

@opaera - Evet - Bu sütunu da görünümde dizine eklemeniz gerekmeyecek. –

+0

Son bir soru, eğer yapabilirsen. Görünümde bir sorgulama yapan bir sp var (indekslenmiş tablonun referans aldığı Görünüm). Dizin adını sorgudan yan tümce belirtebilir miyim? Örneğin. MyView'den (MyTableIndex ile) seçin ... Belki bunu yapmanın bazı faydaları var mı? – opaera

4

Ne hesaplanmış bir sütun işaret benim Index oluşturulan SCHEMABINDING

create function [dbo].[FullNameLastFirst] 
( 
    @IsPerson bit, 
    @LastName nvarchar(100), 
    @FirstName nvarchar(100) 
) 
returns nvarchar(201) 
with schemabinding 
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 


create table Person 
(
isperson bit, 
lastname nvarchar(100), 
firstname nvarchar(100), 
fullname as [dbo].[FullNameLastFirst] (isperson, lastname, firstname) 
) 
go 
insert into person(isperson, lastname, firstname) values (1,'Firstname', 'Surname') 
go 

create index ix1_person on person(fullname) 
go 

select fullname from Person with (index=ix1_person) where fullname = 'Firstname Surname' 
go