Bir Kolonu Anahtar Bir Kolona Göre Parçalama | MsSql

Merhaba, elimde malzemeler ve o malzemelerle uyumlu araç ID’lerinin olduğu şöyle bir veri seti var:

MLZM-1   11111@22222@33333@44444
MLZM-2   55555@66666@77777@88888
MLZM-3   AAAAA@BBBBB@CCCCC@DDDDD

Bu veriden şöyle bir sonuç tablosu elde etmek istiyorum:

MLZM-1   11111
MLZM-1   22222
MLZM-1   33333
MLZM-1   44444
MLZM-2   55555
MLZM-2   66666
MLZM-2   77777
MLZM-2   88888
MLZM-3   AAAAA
MLZM-3   BBBBB
MLZM-3   CCCCC
MLZM-3   DDDDD

Bunun için aşağıdaki scripti kullandım.

SELECT b.MalzemeNo AS ItemNo
	 , t1.value AS AracId
FROM [MalzemeListesi] b WITH (NOLOCK)
	CROSS APPLY master.dbo.fnSplitString(b.Araclar, '@') AS t1
WHERE t1.value <> ''
ORDER BY b.MalzemeNo
OPTION (MAXRECURSION 0); -- Maksimum dongu hatasi icin bunu sifir olarak ayarlamak lazim.

Script içerisinde geçen fonksiyon da bu:

CREATE FUNCTION [dbo].[fnSplitString](@str NVARCHAR(MAX), @sep NVARCHAR(5))
RETURNS TABLE
AS
RETURN
WITH a AS
(
	SELECT CAST(0 AS BIGINT) AS idx1
		 , CHARINDEX(@sep, @str) idx2
	UNION ALL
	SELECT idx2 + 1
		 , CHARINDEX(@sep, @str, idx2 + 1)
	FROM a
	WHERE idx2 > 0
)
SELECT SUBSTRING(@str, idx1, COALESCE(NULLIF(idx2, 0), LEN(@str) + 1) - idx1) AS value
FROM a

Selamlar.

Leave a Reply

Your email address will not be published. Required fields are marked *