Bu makalemizde stored procedure de tanımlayacağımız bir parametreden birden fazla veriyi alarak tablolarımızda arama yapacağız.
- Yazılım Uzmanları
- 13 Mayıs 2018
- 1092 kez görüntülendi.
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.
|
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.
Bu yazıya 0 yorum yapılmış.