2009-06-26 17 views
19

मैं समझता हूं कि टी-एसक्यूएल ऑब्जेक्ट उन्मुख नहीं है। मुझे उन कार्यों का एक सेट लिखना होगा जो सी # में विधि अधिभार की नकल करते हैं।टी-एसक्यूएल उपयोगकर्ता परिभाषित समारोह ओवरलोडिंग?

समारोह ओवरलोडिंग किसी भी तरह से T-SQL में समर्थित है? यदि ऐसा करने के लिए हैक है, तो क्या इसकी अनुशंसा की जाती है?

+1

बस एक मान्य डुप्लिकेट लक्ष्य के रूप में इस सवाल को रखने के लिए, इस समस्या को एसक्यूएल सर्वर 2008, 2008 R2 या 2012 वास्तव में केवल एक चीज है कि कभी भी करीब आ गया में हल नहीं किया गया है - गिने प्रक्रियाओं - मान्य नहीं है। –

उत्तर

10

नहीं, यह करने के लिए कोई रास्ता नहीं है।

मैं तुम्हें आवश्यकता को फिर से, के रूप में, "सेब बनाने के संतरे की तरह लग रहे" अक्सर करते हैं के लिए मुश्किल है या संदिग्ध मान का सुझाव देते हैं।

+23

यह "सेब को संतरे की तरह दिखता नहीं है", फ़ंक्शन ओवरलोडिंग विभिन्न डेटा प्रकारों के समान ऑपरेशन करने की समस्या का एक आम और सुरुचिपूर्ण समाधान है। इस तरह की शर्मनाक टी-एसक्यूएल इसका समर्थन नहीं करता है :( – matao

+1

मैं माता से सहमत हूं। यह ऑब्जेक्ट रिलेशनल डाटाबेस मैनेजमेंट सिस्टम की सबसे जरूरी विशेषताओं में से एक है। –

+0

फिर आपको यह परिणाम उम्मीद करनी चाहिए, क्योंकि SQL सर्वर ऑब्जेक्ट प्रदान नहीं करता है संबंधपरक सुविधाओं। –

4

आप एक sql_variant पास कर सकता है, लेकिन यह इसके आसपास के खतरों के सभी प्रकार के साथ आता है; क्या तुम सच में की तरह आप OO भाषाओं और अधिक भार के साथ कर सकते हैं मजबूत लेखन का उपयोग नहीं कर सकते।

आप अपने समारोह के भीतर आधार प्रकार खोजने की जरूरत है, तो आप SQL_VARIANT_PROPERTY फ़ंक्शन का उपयोग कर सकते हैं।

1

आप एक ही स्ट्रिंग के भीतर मूल्यों की एक सरणी में गुजरती हैं और उन्हें बाहर पार्स using this techique by Erland Sommarskog कर सकते हैं।

param1;param2;parma3;param4 

या

param1:type;param2:type;param3:type 

या

calltype|param1;param2;param3 

आदि:

एक varchar(max) पैरामीटर के साथ एक समारोह या कई यदि आवश्यक हो तो बनाएं, फिर उस स्ट्रिंग की तरह में आपके पैरामीटर मान है , आप केवल अपनी कल्पना से सीमित हैं ...

अपनी इच्छानुसार उन मूल्यों का उपयोग करने के अलावा इस सरणी और उपयोग कार्यक्रम तर्क विभाजित करने के लिए कड़ी से तकनीक का उपयोग करें।

-4

मैं कार्य हर समय ओवरलोड है, लेकिन मुझे पता है कि मुद्दों के इन प्रकार अक्सर मंच पर अत्यधिक निर्भर हैं होता है।

हमारे डीबी 2 प्रणाली पर, मैं नियमित रूप से निम्नलिखित की तरह ओवरलोड:

समारोह बनाएँ Schema1.F1 (parm तारीख) रिटर्न तारीख वापसी तिथि + 1month;

फ़ंक्शन स्कीमा 1.एफ 1 (पार्म टाइमस्टैम्प) रिटर्न दिनांक वापसी दिनांक (टाइमस्टैम्प) + 1 माह;

यह आपको जो समान formating आवश्यकताओं है कई प्रश्न हैं जब वास्तव में काफी उपयोगी है।

मुझे इस बारे में एकमात्र समस्या मिली है, क्या आप बेहतर हैं कि आप फ़ंक्शन चाहते हैं क्योंकि मानक ड्रॉप फ़ंक्शन "स्कीमा"। "नाम" विफल रहता है क्योंकि यह निर्धारित नहीं कर सकता कि कौन सा फ़ंक्शन ड्रॉप करना है। अगर कोई जानता है कि अधिभारित एसक्यूएल कार्यों को कैसे छोड़ना है, तो मुझे बताएं!

+1

यह वास्तव में सहायक नहीं है क्योंकि प्रश्न विशेष रूप से एमएसएसएलएल 2005 – cjk

+1

कहता है, बस हमारे एमएसएसक्यूएल 2005 के खिलाफ परीक्षण किया गया और ऐसा लगता है कि एमएसएसक्यूएल में अधिभार करना संभव नहीं है। फ़ंक्शन गिनती बनाएं() रिटर्न int प्रारंभ वापसी (0) अंत; फ़ंक्शन गिनती बनाएं (@parm int) int प्रारंभ वापसी (@parm) अंत लौटाता है; [त्रुटि कोड: 2714, एसक्यूएल राज्य: 42 एस 01] डेटाबेस में 'गिनती' नामक एक वस्तु पहले से ही है। मुझे पता चला है कि डीबी 2: ड्रॉप ओवर स्कीमा 1.एफ 1 (दिनांक) में अधिभारित कार्यों को कैसे छोड़ना है; ड्रॉप फ़ंक्शन Schema1.F1 (टाइमस्टैम्प); हमारे अधिकांश कार्य इस तरह दिखते हैं: ड्रॉप फ़ंक्शन Schema1.F1 (वर्कर (256)); –

5

एक चीज जिसे मैंने सफलतापूर्वक किया है, इस तरह से फ़ंक्शन को इस तरह लिखना है कि इसे शून्य मानों को संभालने की अनुमति दें, और उसके बाद उन पैरामीटरों के स्थान पर नल के साथ कॉल करें जिन्हें आप छोड़ना चाहते हैं।

उदाहरण:

create function ActiveUsers 
(
    @departmentId int, 
    @programId int 
) 
returns int 
as 
begin 
    declare @count int 

    select @count = count(*) 
    from users 
    where 
     departmentId = isnull(@departmentId, departmentId) 
     and programId = isnull(@programId, programId) 

    return @count 
end 
go 

उपयोग करता है:

select ActiveUsers(1,3) -- users in department 1 and program 3 
select ActiveUsers(null,3) -- all users in program 3, regardless of department 
select ActiveUsers(null,null) -- all users 
0

एक समाधान sql_variant डेटा प्रकार का उपयोग करने के लिए होगा। यह उदाहरण तब तक काम करता है जब तक आप दोनों मानों के लिए समान डेटाटाइप का उपयोग न करें। जो भी डेटाटाइप आप भेजते हैं वह देता है।

create function dbo.Greater(
@val1 sql_variant 
,@val2 sql_variant 
) returns sql_variant 
as 
begin 
declare @rV sql_variant 

set @rV = case when @val1 >= @val2 then @val1 
       else @val2 end 

return @rV 
end 
go 
संबंधित मुद्दे