Bu makalemizde stored procedure de tanımlayacağımız bir parametreden birden fazla veriyi alarak tablolarımızda arama yapacağız.

Bu makalemizde stored procedure de tanımlayacağımız bir parametreden birden fazla veriyi alarak tablolarımızda arama yapacağız. Bu örneğimiz için  Şehirler tablosundan faydalanacağız. Birden fazla şehir id sini alarak bu şehirlerin bilgilerini ekrana  listeleyeceğiz. Öncelikle tablomuzun yapısını aşağıdaki şekilde belirleyelim.

 

tblSehirler
Alan Adı Alan Tipi
fldSehirId int
fldSehirAdi nvarchar(50)

 Yukarıdaki tablo yapısını oluşturan sql kodu aşağıdaki gibi olur.

CREATE TABLE [dbo].[tblSehirler](
	[fldSehirId] [int] NOT NULL,
	[fldSehirAdi] [nvarchar](50) NULL,
CONSTRAINT [PK_tblSehirler] PRIMARY KEY CLUSTERED 
(
	[fldSehirId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Yukarıdaki tablolardan seçeceğimiz birden fazla şehir bilgilerini çekelim. Bunun için stored procedure mizde mümkün olduğu kadar uzun bir parametre oluşturmamız gerekiyor. Bu parametreye seçilen şehir ıd lerini virgülle vereceğiz. Örn: 1,34,16,35,36 Burada Adana, İstanbul, Bursa, İzmir ve Kars şehirlerinin bilgilerini çekeceğiz. Tablodaki değişkenimiz integer ancak bizim parametremiz nvarchar bu parametreyi direkt kullandığımız takdirde hata ile karşılaşacağız. Bunun yerine procedure mizi şöyle oluşturabiliriz.

create proc sp_GetSehirler
	@fldSehirList nvarchar(300)
as
begin
	DECLARE @String nvarchar(300)
	Declare @Next	int
	Declare @Pos int
	DECLARE @Delimiter NVARCHAR(1)
	SET @Delimiter = ','
	-- Burada template table oluşturuyoruz. Böylelikle her şehri bu temp table a atacağız.
	CREATE TABLE #TempSehirList (fldRowId INT IDENTITY(1,1) PRIMARY KEY, fldSehirId int)
	-- Arayacağımız şehirleri String içerisine ayraçla birlikte atıyoruz. 
	SET @String = @fldSehirList + @Delimiter
	-- ilk ayracın pozisyonunu belirliyoruz. ayraç yoksa boş anlamına gelir.
	SET @Pos = charindex(@Delimiter,@String)
	--pos değeri 0 olana kadar döngüde tutuyoruz. 
	WHILE (@Pos <> 0)
	BEGIN
	--Örneğimizde 1,34,16 vardı burada ilk ayraca kadar olan kısmı alıp değeri integer a çeviriyor. 
		SET @Next = Cast(substring(@String,1,@Pos - 1) as int)
		-- @Next in içeriği parametreyi döngü içerisinde parçalar halinde alarak 
		-- tblSehirler tablosundan ilgili kayıtları bulup temp tabloya atacaktır.
		INSERT INTO #TempSehirList (fldSehirId)
			Select	fldSehirId
			From	[tblSehirler]
			Where	fldSehirId=@Next
		-- @String içerisinden bulduğumuz şehrin id sini çıkarıyoruz. 
		Set @String = SUBSTRING(@String,@Pos + 1,LEN(@String))
		-- içeride ayrac olup olmadığını (sona gelip gelinmediği) kontrol ediyoruz.
		SET @Pos = charindex(@Delimiter,@String)	
	END
	-- Temp tablomuz seçtiğimiz şehirlerin id si ile doldu. 
	-- Şimdi onu tblSehirler ile eşleştirerek seçilen şehirlerin bilgilerine ulaşıyoruz.
	Select	SH.fldSehirId,
		SH.fldSehirAdi
	From	tblSehirler SH
	INNER JOIN #TempSehirList TSH on (TSH.fldSehirId=SH.fldSehirId)
end

Bu makalemizde While kullanımının yanı sıra pos, temptable ın nasıl kullanıldığını gördük.

İyi çalışmalar dilerim.

İlgili Makaleler

Bu yazıya 0 yorum yapılmış.

Yorum Gönder