16 Haziran 2015 Salı

T-SQL string dizisi olarak gönderilen değerleri prosedür ile işleme örneği

Merhaba,

T-SQL'de yeni 2012 öncesi versiyonlarda dizi değişkeni olmadığı için pratik olarak dizi değişkenlerini işleyip verileri tablolara işleme işlemi mümkün değildi. (2012,2014'de var mı bilmiyorum)

Bu konuda 2009 yıllarında yazdığım ve ancak buraya not etmek fırsatı bulduğum bir T-sql  ile dizi işleme örneği göstereceğim.  Örnek uygulamamız anket tablosu olacak. Ancak uygulamanın sadece T-SQL tarafı  gelen string diziyi anket tablosuna yazan kısmını buraya yazacağım, .net vb uygulama tarafında bu diziler nasıl oluşturulur kısmına burada değinmeyeceğim.


uygulama tabloları : tblANKET  her bir anket değerlendiricisi için bir kayıt tutan ve anketin idsini içeren tablo.

tblANKET_DETAY : her bir anket kullanıcısının sorulara verdiği 5li seçenekleri tutan tablo.

Soruların olduğu tablo konumuz dışında olduğu için burada önemli değil.


aşağıda vereceğim  spAnketKaydet  prosedürüne   3 adet parametre gönderilecek.

1.parametre anketin  o sıradaki kullanıcıya aid olan idsi.
2. parametre soruların idlerinin virgülle ayrılmış string dizisi.
3. parametre sorulara verilen cevap seçeneklerinin (1-5 arası) virgülle ayrılmış string dizisi.

bu değerler uygulama tarafından  oluşturulup bu sp ye gönderilirse, bu prosedür tüm seçenekleri ilgili sorulara kaydedecektir.

Prosedür:


CREATE proc [dbo].[spAnketKaydet](@pid int,@soruidler varchar(200),@secenekler varchar(200))
as
begin
/*

örnek kullanım :
exec spAnketKaydet 17747, '2,3,4,5','3,3,4,5'


tlbANKET tablosundaki  17747 idli anket için;
  2idli soruya 3üncü seçenek
  3idli soruya 3üncü seçenek
  4idli soruya 4üncü seçenek
  5idli soruya 5inci seçenek

*/

declare @s varchar(5)

select @s=AnketUserID from tblAnket where ID=@pid


declare @soruid int
declare @secenek int


declare @Vk int
declare @Pk int
declare @Vs int
declare @Ps int
set @Pk=1
set @Ps=1

declare @cik int
set @cik=0



SET XACT_ABORT OFF --ya hep ya hiç


BEGIN TRY

  BEGIN TRAN

while(@cik=0)
begin

-- soruidler dizisinde virgül pozisyonu
set @Vk= charindex(',',@soruidler,@Pk)
if @Vk=0  --dizinin son elemanına gelinince...
 begin
  --select @Pk-1,len(@soruidler) as fff
  set  @soruid=Convert(int,substring(@soruidler,@Pk,(len(@soruidler)-@Pk+1)))
  set @cik=1
 end
  else                  
  begin  --  pk'dan virgül pozisyonuna kadar olan kısmı (dizi elemanı) al sorna pkyi bunun boyu kadar artır..
    set  @soruid=Convert(int,substring(@soruidler,@Pk,@Vk-@Pk))
  end
set @Pk=@Vk+1


--yukardakin aynı mantıkla secenekler dizisinini de tek tek okuyoruz..

set @Vs= charindex(',',@secenekler,@Ps)
if @Vs=0
 begin
  set  @secenek=Convert(int,substring(@secenekler,@Ps,(len(@secenekler)-@Ps+1)))
 end
  else
  begin
    set  @secenek=Convert(int,substring(@secenekler,@Ps,@Vs-@Ps))
  end
set @Ps=@Vs+1

--select @soruid,@secenek


if  @secenek>0
 begin
if exists(select * from tblANKET_DETAY where SORUID=@soruid and ANKETID=@pid)  --anketin ilgili sorusuna ait seçenek zaten kayıtlı ise güncelle..
 begin
    update tblANKET_DETAY
     set SECENEK=@secenek
     where ANKETID=@pid and SORUID=@soruid
 end
 else
 begin   --değilse yeni ekle..
    insert into tblANKET_DETAY
    (ANKETID,SORUID,SECENEK)
    values(@pid,@soruid,@secenek)
 end


  UPDATE tblANKET set KAYITTARIHI=getdate() where ID=@pid

end
   
end --while



 COMMIT

 select 'tamam' as durum
END TRY
BEGIN CATCH
  ROLLBACK
  select 'hata' as durum
declare @msj varchar(MAX)
   set @msj='HATA OLUŞTU : ' + ERROR_MESSAGE()
   select @msj as 'hatamesajı'
END CATCH



END



Hiç yorum yok: