MS SQL Virgüllü değerleri ayırma

Öncelikle bu yazı için başlık bulmak oldukça zor oldu ve en sonunda bu başlıkta karar kıldım.

Bu yazı çalıştığımız SSRS projesi için bir ihtiyaçtan hasıl oldu. Virgül ile ayrılmış değerleri bir değişkene tek tek göndermem gerekti. Bende bu virgülle ayrılmış değerleri bir tablonun sütununa yazdırabilirsem değerleri kullanabileceğimi düşündüm. Sonra bir kaç araştırmadan sonra sonuca ulaştım. Gelin beraber nasıl yapıldığını öğrenelim…

Bir SSRS projesinde şöyle bir procedure kullanıyordum.

CREATE PROCEDURE [dbo].[sp_R_CariHesap_Sip_Bakiyeleri](@Tarih1 as datetime,@Tarih2 as datetime,@Temsilci as nvarchar(MAX),@Grup as nvarchar(10))

AS
BEGIN

select
C.*
,S.sip_bakiye AS [Sip. Bakiye]
,PS.pro_bakiye AS [Pro. Bakiye]
,S.sip_bakiye+PS.pro_bakiye AS[Toplam Sip. Bakiye]
from dbo.R_CariBakiye(@Tarih1,@Tarih2,@Grup)AS C
LEFT OUTER JOIN dbo.R_sip_groupby_cari(@Tarih2) S ON C.[Cari Kodu]=S.sip_musteri_kod AND S.sip_tip=1
LEFT OUTER JOIN dbo.R_prosip_groupby_cari(@Tarih2) PS ON C.[Cari Kodu]=PS.pro_mustkodu AND PS.pro_tipi=1
WHERE C.[Temsilci Kodu] LIKE @Temsilci + '&'

END

----------

exec sp_R_CariHesap_Sip_Bakiyeleri @Tarih1,@Tarih2,@Temsilci,@Grup

Fakat SSRS den @Temsilci değişkenine gelen veriler aşağıdaki gibiydi

DECLARE @Tarih1 DATETIME  SET @Tarih1=GETDATE()
DECLARE @Tarih2 DATETIME  SET @Tarih2=GETDATE()
DECLARE @Temsilci NVARCHAR(MAX) SET @Temsilci='P012,P025,P.028,P.029'
DECLARE @Grup NVARCHAR(10) SET @Grup=''


exec sp_R_CariHesap_Sip_Bakiyeleri @Tarih1,@Tarih2,@Temsilci,@Grup
Sorguyu çalıştırdığımda dolayısıyla boş geliyordu.

Gelen veriyi tek tek elemanlarına ayırmam gerekiyordu. Bir kaç araştırmadan sonra şöyle bir fonksiyon buldum….


CREATE function [dbo].[cSplitter] (@Parameter VARCHAR(MAX))
RETURNS @splitResult table (number int, [value] varchar(100))
as
begin
SET @Parameter = ','+@Parameter +',';

WITH cteTally AS
	(
		SELECT TOP (LEN(@Parameter))
			ROW_NUMBER() OVER (ORDER BY t1.Object_ID) AS N
			FROM Master.sys.All_Columns t1
			CROSS JOIN Master.sys.All_Columns t2
	)
insert @splitResult
	SELECT ROW_NUMBER() OVER (ORDER BY N) AS Number,
	SUBSTRING(@Parameter,N+1,CHARINDEX(',',@Parameter,N+1)-N-1) AS [Value]
	FROM cteTally
		WHERE N < LEN(@Parameter) AND SUBSTRING(@Parameter,N,1) = ','
return
end

Araştırmama göre sahibi “Jeff Moden” diye bir abimiz. Teşekkür ediyoruz. Fonksiyonun içeriğine de başka bir yazıda değineceğim.

Fonksiyona değişkenimizi koyduğumuzda istediğimiz sonucu aldığımızı görüyoruz.

Evet gördüğünüz gibi virgülle ayrılmış değerlerimiz yeni bir tabloda sıralanmış durumda. Şimdi de procedure de where şartını aşağıdaki gibi değiştirirsek. Sorgumuz çalışacaktır.

WHERE C.[Temsilci Kodu] IN (SELECT value FROM cSplitter(@Temsilci))

Gördüğünüz gibi sorgumuz artık çalışıyor. Yazıyı gerçek verilerle hazırladığım için son görselde çıktıyı karartmak durumunda kaldım.

REVİZE

Linkedin Üzerinden Emre Öğreten beyin spring_split fonksiyon önerisini de yazıma eklemek istedim.

Yukarıda oluşturduğumuz fonksiyon zaten SQL SERVER 2016 sürümüyle birlikte spring_split fonksiyonuyla gelmiş bulunmakta.

Fonksiyonun kullanımı şu şekilde STRING_SPLIT ( string , separator)

Gördüğünüz gibi yukarıda oluşturduğumuz fonksiyonla aynı sonucu aldık. Tabi bu fonksiyon yerleşik olduğu için çok daha hızlı ve verimli çalışacaktır.

Okuduğunuz için teşekkür ederim…

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir