2010-04-15

Gizli Sonsuz Döngü

Diyelim ki parametre olarak verilen bir string’i 16 karaktere tamamlama ihtiyacımız var ve aşağıdaki gibi sp’mizi yazdık:

create proc FixedLength
@InputStr varchar(16)
as
begin
set nocount on
while len(@InputStr) < 16
begin
set @InputStr = @InputStr + ' '
end
select @InputStr
end
go

Gayet basit bir şekilde, @InputStr’nin uzunluğu 16 karakterden küçük olduğu sürece @InputStr değişkeninin sonuna boşluk karakteri ekleniyor. Gayet masumane gibi gözükse de sp’mizi aşağıdaki gibi çalıştırdığımızda sonsuz bir döngünün fitilini ateşlemiş oluruz:

exec FixedLength '123456';

LEN fonksiyonu; karakter kümesinin sağındaki boşlukları kale almaz, yani bir nevi RTRIM yapar. len(@InputStr) değeri sürekli 6 olarak döndüğü için sonsuz döngüye girer. Sorunun çözümü için hemen datalength fonksiyonunu kullanalım diyenleri duyar gibiyim Evet, datalength fonksiyonu bu sp’miz için çözüm olur fakat @InputStr varchar(16) yerine nvarchar(16) olsaydı sp sonsuz döngüye girmezdi ama istediğimiz sonucu da alamazdık.(@InputStr='123456 ' olduğunda datalength(@InputStr) değeri 16 olur ve döngüden çıkar fakat elde etmek istediğimiz '123456 ' sonucunu alamamış olurduk). Bir değişken nvarchar olduğunda her karakter için 2 byte yer kaplar. Datalength fonksiyonu nvarchar olarak tanımlanan bir değişkenin karakter uzunluğunu karakter sayısının 2 katı olarak verir.

Not: While döngüsü kullanmadan daha kısa kod ile işimizi halledebiliriz diyenler için aşağıdaki kısa kod işimizi görür ama sonsuz döngü örneğimiz için işimize yaramaz:)

create proc FixedLength
@InputStr varchar(16)
as
begin
set nocount on
set @InputStr=@InputStr + replicate(' ',16-len(@InputStr))
select @InputStr
end
go

Hiç yorum yok:

.::YASAL UYARI::.

©2004-2023 Mehmet GÜZEL, www.mehmetguzel.net

Site içeriği kaynak gösterilmek koşuluyla yayınlanabilir. Yazılan yazı ve yorumlar sadece yazı ve yorum sahiplerini bağlar.