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:
Yorum Gönder