Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एक संग्रहीत प्रक्रिया के तर्क के रूप में एक सूची-संरचना पास करें

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

"एसक्यूएल सर्वर 2005 और उसके बाद में सरणियाँ और सूचियाँ, जब तालिका मान पैरामीटर नहीं करते हैं कट इट" एरलैंड सोमरस्कोग द्वारा

आपको एक स्प्लिट फ़ंक्शन बनाने की आवश्यकता है। स्प्लिट फ़ंक्शन का उपयोग इस प्रकार किया जा सकता है:

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

मैं टीएसक्यूएल में एक स्ट्रिंग को विभाजित करने के लिए संख्या तालिका दृष्टिकोण को प्राथमिकता देता हूं लेकिन SQL सर्वर में स्ट्रिंग्स को विभाजित करने के कई तरीके हैं, पिछला लिंक देखें, जो प्रत्येक के पेशेवरों और विपक्षों की व्याख्या करता है।

Numbers Table मेथड के काम करने के लिए, आपको यह एक टाइम टेबल सेटअप करना होगा, जो एक टेबल 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)

Numbers टेबल सेट हो जाने के बाद, इस स्प्लिट फंक्शन को बनाएं:

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 स्ट्रिंग को एक टेबल में विभाजित कर सकते हैं और उसमें शामिल हो सकते हैं। अपने कार्य को पूरा करने के लिए, यदि आप दो मापदंडों में से एक में पास कर सकते हैं, एक कुंजी मान में से एक है, तो अपनी प्रक्रिया इस तरह बनाएं:

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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. माइक्रोसॉफ्ट एक्सेस बनाम एसक्यूएल सर्वर

  2. पढ़ने के लिए प्रतिबद्ध और दोहराने योग्य पढ़ने के बीच अंतर

  3. Sql सर्वर प्रोफाइलर में exec sp_reset_connection का क्या अर्थ है?

  4. पदानुक्रमित डेटा के लिए आवश्यक सीटीई कार्यान्वयन

  5. SQL पुनरावर्ती क्वेरी कैसे डिज़ाइन करें?