यदि आप SQL सर्वर 2016+ पर हैं
आप नए STRING_SPLIT
. का उपयोग कर सकते हैं फ़ंक्शन, जिसके बारे में मैंने यहाँ ब्लॉग किया है, और ब्रेंट ओज़र ने यहाँ के बारे में ब्लॉग किया है।
SELECT s.[message-id], f.value
FROM dbo.SourceData AS s
CROSS APPLY STRING_SPLIT(s.[recipient-address], ';') as f;
यदि आप अभी भी SQL Server 2016 से पहले के संस्करण पर हैं
एक विभाजन समारोह बनाएँ। यह वहां मौजूद कई उदाहरणों में से एक है:
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 s1.[object_id])
FROM sys.all_objects AS s1 CROSS APPLY sys.all_objects) AS n(Number)
WHERE Number <= CONVERT(INT, LEN(@List))
AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
) AS y);
GO
मैंने यहां कुछ अन्य लोगों के बारे में यहां चर्चा की है, और यहां पहली जगह में विभाजित होने से बेहतर दृष्टिकोण पर चर्चा की है।
अब आप आसानी से एक्सट्रपलेशन कर सकते हैं:
SELECT s.[message-id], f.Item
FROM dbo.SourceData AS s
CROSS APPLY dbo.SplitStrings(s.[recipient-address], ';') as f;
इसके अलावा, मैं सुझाव देता हूं कि कॉलम नामों में डैश न डालें। इसका मतलब है कि आपको उन्हें हमेशा [square brackets]
. में रखना होगा ।