आप एक स्ट्रिंग से कई मानों को आसानी से विभाजित कर सकते हैं। मान लें कि आप "कॉलम" को अलग करने के लिए अल्पविराम का उपयोग करके और "पंक्तियों" को अलग करने के लिए अर्ध-कॉलन का उपयोग करके स्ट्रिंग को इस तरह बंडल कर सकते हैं:
foo, 20120101, 26; bar, 20120612, 32
(यह मानता है कि कोलन और सेमी-कोलन डेटा में स्वाभाविक रूप से प्रकट नहीं हो सकते हैं; यदि वे कर सकते हैं, तो आपको अन्य सीमांकक चुनने की आवश्यकता होगी।)
आप इस तरह एक विभाजित दिनचर्या बना सकते हैं, जिसमें एक आउटपुट कॉलम शामिल है जो आपको मूल स्ट्रिंग में दिखाई देने वाले क्रम को निर्धारित करने की अनुमति देता है:
CREATE FUNCTION dbo.SplitStrings
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
AS
RETURN (SELECT Number = ROW_NUMBER() OVER (ORDER BY Number),
Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number,
CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects) AS n(Number)
WHERE Number <= CONVERT(INT, LEN(@List))
AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
) AS y);
GO
फिर आप इसे इस तरह से क्वेरी कर सकते हैं (सादगी और चित्रण के लिए मैं केवल 3 गुणों को संभाल रहा हूं लेकिन आप इसे 11 या n के लिए एक्सट्रपलेशन कर सकते हैं):
DECLARE @x NVARCHAR(MAX); -- a parameter to your stored procedure
SET @x = N'foo, 20120101, 26; bar, 20120612, 32';
;WITH x AS
(
SELECT ID = s.Number, InnerID = y.Number, y.Item
-- parameter and "row" delimiter here:
FROM dbo.SplitStrings(@x, ';') AS s
-- output and "column" delimiter here:
CROSS APPLY dbo.SplitStrings(s.Item, ',') AS y
)
SELECT
prop1 = x.Item,
prop2 = x2.Item,
prop3 = x3.Item
FROM x
INNER JOIN x AS x2
ON x.InnerID = x2.InnerID - 1
AND x.ID = x2.ID
INNER JOIN x AS x3
ON x2.InnerID = x3.InnerID - 1
AND x2.ID = x3.ID
WHERE x.InnerID = 1
ORDER BY x.ID;
परिणाम:
prop1 prop2 prop3
------ -------- -------
foo 20120101 26
bar 20120612 32