2010-12-07 10 views
5

कैसे एक एक SQL CLR संग्रहीत प्रक्रिया के लिए एक sql_variant पैरामीटर जोड़ सकते हैं? System.Object का उपयोग करना काम नहीं करता है, और मुझे कोई भी विशेषता दिखाई नहीं दे रही है जिसका मैं उपयोग कर सकता हूं।कैसे एक SQL CLR संग्रहीत प्रक्रिया के लिए एक sql_variant पैरामीटर के लिए?

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void ClearOnePartition(
    SqlString aString 
    , /* I want this to be a sql_variant */ object aVariant 
) 
{ 
    //do stuff here 
} 
+1

मैं तुम्हें यकीन नहीं है:

आप वस्तु में मूल्य के अंतर्निहित प्रकार जानना चाहते हैं, का उपयोग GetType() विधि (यह सबसे अधिक संभावना नहीं SQL_VARIANT/object होने जा रहा है) कर सकते हैं। मुझे लगता है कि क्लाइंट एपीआई अलग-अलग अनुवाद कैसे करते हैं, इसके बारे में बहुत सारे संदर्भ हैं। nvarchar या बाइनरी कॉलम। क्या यह एक sql_variant होना चाहिए? –

+1

@Damied_The_Unbeliever: हाँ, यह एक sql_variant होने की जरूरत है। मैं किसी दिए गए विभाजन के लिए सीमा के मूल्य में पारित करने की कोशिश कर रहा हूं, जो एसक्यूएल में एक sql_variant प्रकार के रूप में मौजूद है। – Burg

+0

विभाजन के लिए सीमा मान नहीं हैं, सख्ती से sql_variants (उदाहरण के लिए, वे टाइप टेक्स्ट का मान स्वीकार नहीं कर सकते हैं)। मुझे नहीं लगता कि वे वास्तव में एसक्यूएल में एक अच्छी तरह से परिभाषित प्रकार है। विभाजन कार्यों के साथ काम करने के लिए एसएमओ कार्यों में देख रहे हैं, उन्हें ऑब्जेक्ट के रूप में माना जाता है, इसलिए मुझे विश्वास नहीं है कि उनके लिए एक बेहतर .NET प्रकार है। –

उत्तर

3

Mapping CLR Parameter Data एसक्यूएल पुस्तकें ऑनलाइन, Object से में के रूप में सही प्रकार मैप करने के लिए sql_variant उपयोग करने के लिए सूचीबद्ध है।

मैं एक साधारण एसक्यूएल सर्वर प्रोजेक्ट बनाया और उसमें निम्न वर्ग कहा:

DECLARE @thing sql_variant = 'hahahahaha'; 

EXEC dbo.StoredProcedure1 @thing 

इस रूप में चलता है:

public partial class StoredProcedures 
{ 
    [Microsoft.SqlServer.Server.SqlProcedure] 
    public static void StoredProcedure1(object param1) 
    { 
     // Put your code here 
     //Trace.Write(param1); 
     SqlContext.Pipe.Send(param1.ToString()); 

    } 
}; 

मैं तो इस संग्रहीत proc व्यायाम करने के लिए test.sql फ़ाइल को संशोधित उम्मीद और निम्नलिखित उत्पादन का उत्पादन:

hahahahaha

कोई पंक्ति को प्रभावित किया।

(0 पंक्ति (यों) लौटे)

sp_executesql दौड़ना समाप्त हो गया।

1

विभाजन सीमा मान, जो कि CREATE PARTITION FUNCTION दस्तावेज में दिखाया गया है, कई अलग अलग प्रकार के हो सकते हैं:

सभी डेटा प्रकार, विभाजन स्तंभों के रूप में उपयोग के लिए मान्य हैं पाठ, ntext, छवि, एक्सएमएल को छोड़कर , टाइमस्टैम्प, varchar (max), nvarchar (अधिकतम), varbinary (अधिकतम), उर्फ ​​डेटा प्रकार, या CLR उपयोगकर्ता परिभाषित डेटा प्रकार।

और उनके वास्तविक डेटाप्रकार sys.partition_parameters में संग्रहित है।

लेकिन यदि कोई उन्हें sys.partition_range_values से बाहर निकाल रहा है, तो value फ़ील्ड SQL_VARIANT (और अच्छे कारण के लिए) के प्रकार का है।

हां, SQL_VARIANT (जैसा कि पहले से कहा गया है) नक्शे को object में .NET में।

आप NULLs के लिए जाँच करने की जरूरत है, DBNull.Value करने के लिए वस्तु की तुलना करें।

if (aVariant.GetType() == typeof(SqlInt16)) 
संबंधित मुद्दे