26

मैं निम्नलिखित उपयोगकर्ता परिभाषित समारोह है:Sql सर्वर नियतात्मक उपयोगकर्ता परिभाषित समारोह

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 

मैं एक गणना स्तंभ में इस समारोह का उपयोग कर कारण यह निर्धारित करने योग्य नहीं है पर एक सूचकांक नहीं बना सकते। कोई यह समझा सकता है कि यह निर्धारिती क्यों नहीं है और आखिरकार इसे निर्धारित करने के लिए कैसे संशोधित किया जाए? धन्यवाद

उत्तर

40

आपको इसे with schemabinding बनाने की आवश्यकता है।

SQL सर्वर तब सत्यापित करेगा कि यह निर्धारिती के रूप में माना जाने वाला मानदंड पूरा करता है या नहीं (जो ऐसा करता है क्योंकि यह किसी बाहरी तालिका तक नहीं पहुंचता है या getdate() जैसे गैर निर्धारक कार्यों का उपयोग नहीं करता है)।

आप सत्यापित कर सकते हैं कि यह

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

अपने मूल कोड को schemabinding विकल्प जोड़ा जा रहा है के साथ काम किया ठीक काम करता है, लेकिन एक से थोड़ा सरल संस्करण होगा।

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

साथ उपयोगकर्ता निर्धारित समारोह की घोषणा करने की जरूरत है मैं अपने सूचकांक गणना स्तंभ की ओर इशारा करते बनाया। मेरे पास एक दृश्य भी है जो मेरी तालिका को संदर्भित करता है। मुझे लगता है कि मुझे उसी कॉलम पर इंडेक्स बनाने के लिए भी दृश्य पर स्कीमा बाइंडिंग निर्दिष्ट करना होगा। इसके बारे में, यदि गणना की गई कॉलम पर इंडेक्स के रूप में मेरी बेस टेबल अनावश्यक है तो व्यू पर एक और इंडेक्स बनाएं? – opaera

+0

@ ओपेरा - हां - आपको उस कॉलम को दृश्य में इंडेक्स करने की आवश्यकता नहीं होगी। –

+0

एक अंतिम सवाल, यदि आप कर सकते हैं। मेरे पास एक ऐसा स्पा है जो व्यू पर एक क्वेरी बनाता है (दृश्य मेरी अनुक्रमित तालिका का संदर्भ देता है)। मैं खंड से क्वेरी में इंडेक्स नाम निर्दिष्ट/निर्दिष्ट कर सकता/सकती हूं? जैसे * MyView से (MyTableIndex के साथ) चुनें ... हो सकता है कि मेरे पास कुछ फायदे हैं? – opaera

4

आप 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 
संबंधित मुद्दे