आपको टीएसक्यूएल में स्ट्रिंग को विभाजित और संसाधित करने का एक तरीका चाहिए, ऐसा करने के कई तरीके हैं। इस लेख में लगभग हर विधि के पेशेवरों और विपक्षों को शामिल किया गया है:
आपको एक स्प्लिट फ़ंक्शन बनाने की आवश्यकता है। स्प्लिट फ़ंक्शन का उपयोग इस प्रकार किया जा सकता है:
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)