2010-08-24 22 views
9

पर एक तर्क-संरचना के रूप में एक सूची-संरचना पास करें क्या एमएस एसक्यूएल 2005 सर्वर पर संग्रहीत प्रक्रिया के लिए तर्क के रूप में Dictionary<String, String> (या कुछ समान; कुंजी/मूल्य जोड़ी) को पास करना संभव है?संग्रहित प्रक्रिया

मैं एक व्यावहारिक उदाहरण की तलाश में हूं।

अद्यतन

यह सवाल मुझे नेतृत्व this one पूछने के लिए।

उत्तर

6

आपको टीएसक्यूएल में स्ट्रिंग को विभाजित करने और संसाधित करने का एक तरीका चाहिए, ऐसा करने के कई तरीके हैं। यह लेख पक्ष और लगभग हर विधि के विपक्ष को शामिल किया गया:

"Arrays and Lists in SQL Server 2005 and Beyond, When Table Value Parameters Do Not Cut it" by Erland Sommarskog

आप एक विभाजन समारोह बनाना होगा। इस तरह एक विभाजन समारोह इस्तेमाल किया जा सकता है:

SELECT 
    * 
    FROM YourTable        y 
    INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value 

I prefer the number table approach to split a string in TSQL लेकिन वहाँ एसक्यूएल सर्वर में विभाजित करने के लिए तार, पिछले लिंक है, जो लाभ और प्रत्येक के विपक्ष बताते देखने के कई तरीके हैं।

नंबर तालिका विधि के लिए काम करने के लिए, तो आप इस एक समय तालिका सेटअप है, जो एक मेज Numbers कि से 1 से 10,000 पंक्तियां हैं पैदा करेगा क्या करने की जरूरत:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number 
    INTO Numbers 
    FROM sys.objects s1 
    CROSS JOIN sys.objects s2 
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number) 

एक बार नंबर मेज की स्थापना की है , इस स्प्लिट फ़ंक्शन को बनाएं:

CREATE FUNCTION [dbo].[FN_ListToTableRows] 
(
    @SplitOn char(1)  --REQUIRED, the character to split the @List string on 
    ,@List  varchar(8000)--REQUIRED, the list to split apart 
) 
RETURNS TABLE 
AS 
RETURN 
(
    ---------------- 
    --SINGLE QUERY-- --this will return empty rows, and row numbers 
    ---------------- 
    SELECT 
     ROW_NUMBER() OVER(ORDER BY number) AS RowNumber 
      ,LTRIM(RTRIM(SUBSTRING(ListValue, number+1, CHARINDEX(@SplitOn, ListValue, number+1)-number - 1))) AS ListValue 
     FROM (
       SELECT @SplitOn + @List + @SplitOn AS ListValue 
      ) AS InnerQuery 
      INNER JOIN Numbers n ON n.Number < LEN(InnerQuery.ListValue) 
     WHERE SUBSTRING(ListValue, number, 1) = @SplitOn 
); 
GO 

अब आप आसानी से एक तालिका में एक CSV स्ट्रिंग को विभाजित कर सकते हैं और इसमें शामिल हो सकते हैं। अपने कार्य को पूरा करने के लिए, SIF आप दो पैरामीटर, कुंजी में से एक मान में से एक में पारित कर सकते हैं, तो इस तरह से अपनी प्रक्रिया बनाने के लिए:

CREATE PROCEDURE StoredProcedureName 
(
    @Params1 int 
    ,@Array1 varchar(8000) 
    ,@Params2 int 
    ,@Array2 varchar(8000) 
) 
AS 

DECLARE @YourTable table (col1 int, col2 int) 

INSERT INTO @YourTable 
     (col1, col2) 
    SELECT 
     a1.ListValue, a2.ListValue 
     FROM dbo.FN_ListToTableRows(',',@Array1)   a1 
      INNER JOIN dbo.FN_ListToTableRows(',',@Array2) a2 ON a1.RowNumber=a2.RowNumber 

select * from @YourTable 

GO 

यह परीक्षण बाहर:

exec StoredProcedureName 17,'127,204,110,198',7,'162,170,163,170' 

उत्पादन:

(4 row(s) affected) 
col1  col2 
----------- ----------- 
127   162 
204   170 
110   163 
198   170 

(4 row(s) affected) 

या आप इस तरह एक एकल पैरामीटर कुंजी मान युग्म उपयोग कुछ में पारित करने के लिए चाहते हैं:

CREATE PROCEDURE StoredProcedureName 
(
    @KeyValueList varchar(8000) 
) 
AS 

DECLARE @YourTable table (RowKey varchar(500), RowValue varchar(500)) 

INSERT INTO @YourTable 
     (RowKey, RowValue) 
    SELECT 
     LEFT(y.ListValue,CHARINDEX(',',y.ListValue)-1),RIGHT(y.ListValue,LEN(y.ListValue)-CHARINDEX(',',y.ListValue)) 
     FROM dbo.FN_ListToTableRows(';',@KeyValueList) y 

SELECT * FROM @YourTable 

GO 

यह रन:

exec StoredProcedureName 'a,5;b,BBB;abc,xyz' 

उत्पादन:

RowKey RowValue 
------- ----------- 
a  5 
b  BBB 
abc  xyz 

(3 row(s) affected) 
5

स्वरूप एक एक्सएमएल में इस शब्दकोश और इस पर एसक्यूएल सर्वर के लिए गुजरती हैं। यह एक्सएमएल डेटाटाइप को समझता है और इसे पूछ सकता है।

<Data> 
    <Entry Key="1" Value="One" /> 
    <Entry Key="2" Value="Two" /> 
</Data> 

और इसे SqlDataType.Xml के रूप में पास करें। एसक्यूएल 2005 और बाद में एक्सएमएल से पूछताछ करने में सक्षम है। एसक्यूएल सर्वर में एक्सएमएल के साथ काम करने के तरीके के बारे में बहुत सारे उदाहरण हैं।

+3

क्या आप विस्तृत कर सकते हैं? – roosteronacid

संबंधित मुद्दे