Kimi zaman test ortamlarında kullanılmak üzere rastgele oluşturulmuş verilere ihtiyaç duyulmaktadır. Bu ihtiyaçların başında da rastgele oluşturuluş kullanıcı listesidir. Bu yazımızda kullanıcıların adı ve soyadlarını bir kolonda tutan (FullName) veri tabanı için rastgele ad soyad listesi ve bu ad soyad listesinden faydalanarak kullanıcı adları ve mail adresleri oluşturacağız.
Bu işlem için adımlarımız şöyle olacak;
Mevcut gerçek verileri tutmak için bir geçici tabloyu ve gerekli değişkenleri oluşturacağız.
drop table if exists #Names create table #Names( userName nvarchar(100) null, [Name] nvarchar(200), [Surname] nvarchar(200) ) declare @n nvarchar(200) -- ad declare @sn nvarchar(200) -- soyad declare @un nvarchar(200) -- kullanıcı adı declare @id int -- gerçek verinin Id değeri declare @max int -- gerçek verinin satır sayısı
Rastgele sayı üretimi için aralığı tespit etmek için gerçek verinin satır sayısı @max değişkenine atanır.
select @max = COUNT(*) from Users
Gerçek veriden ad soyad alanı sorgulanarak SUBSTRING ve CHARINDEX fonksiyonları yardımı ile ilk boşluk karakterinden ad soyad (FullName) alanı ad ve soyad alanlarına ayrıştırılıp oluşturulan geçici tabloya eklenir. TRIM fonksiyonu ile de soyadın başında oluşan boşluk karakterleri silinir.
insert into #Names([Name], [Surname]) select SUBSTRING(FullName,0, CHARINDEX(' ', FullName)), SUBSTRING(FullName,CHARINDEX(' ', FullName),200) from Users where CHARINDEX(' ', FullName) > 1 update #Names set [Surname] = TRIM([Surname])
Geçici tabloya ad soyadlar alındıktan sonra CURSOR yardımı ile gerçek tablo baştan sona dönülerek her satırın Id değeri alınır ve her satırda ORDER BY NEWID() işlemi ile rastgele bir ad ve soyad seçilir. Ad ve soyad seçildikten sonra adın ilk harfi, soyadın tamamı ve sonuna 1 – @max değişkeni arasında rastgele bir sayı ile birleştirilerek kullanıcı adı oluşturulur. Kullanıcı adı oluşturulurken kullanıcı adının daha önce oluşmuş olma ihtimaline karşılık while exists (select UserName from Users where UserName = @un) döngüsü ile oluşturulan kullanıcı adında bir kullanıcı adı var olduğu sürece yenisini oluşturulur. REPLACE fonksiyonu ile de kullanıcı adındaki Türkçe karakterler silinir. Soyadı seçerken de where CHARINDEX(‘ ‘, [Surname]) = 0 şartı ile sadece tek soyadı olanlar arasından seçim yapılır.
--SQL CURSOR KULLANIMI DECLARE crs CURSOR FOR SELECT Id FROM Users -- Cursur de işlenecek veriler ve listeyi select sorgusu ile çekiyoruz . OPEN crs -- Cursor ü açıyoruz FETCH NEXT FROM crs INTO @id -- Select sorgusunda gelen sütunlar sırasına göre değişkenlere atanır Örn : @id = Id WHILE @@FETCH_STATUS =0 BEGIN select @n = [Name] from #Names order by NEWID() select @sn = [Surname] from #Names where CHARINDEX(' ', [Surname]) = 0 order by NEWID() set @un = lower(SUBSTRING(@n,1,1)+@sn+CONVERT(varchar, CONVERT(int, RAND()*@max+1))) set @un = REPLACE(@un,'ç', 'c') set @un = REPLACE(@un,'ı', 'i') set @un = REPLACE(@un,'ğ', 'g') set @un = REPLACE(@un,'ö', 'o') set @un = REPLACE(@un,'ş', 's') set @un = REPLACE(@un,'ü', 'u') while exists (select UserName from Users where UserName = @un) begin set @un = lower( SUBSTRING(@n,1,1)+@sn+CONVERT(varchar, CONVERT(int, RAND()*@max+1))) set @un = REPLACE(@un,'ç', 'c') set @un = REPLACE(@un,'ı', 'i') set @un = REPLACE(@un,'ğ', 'g') set @un = REPLACE(@un,'ö', 'o') set @un = REPLACE(@un,'ş', 's') set @un = REPLACE(@un,'ü', 'u') end update Users set FullName = @n + ' ' + @sn, UserName = @un where Id = @id FETCH NEXT FROM crs INTO @id END CLOSE crs -- Cursor ü kapatıyoruz. DEALLOCATE crs -- Cursor ile işimiz bittiğinde sistemden tamizlememiz için DEALLOCATE etmemiz gerekmektedir.
Son işlem olarak kullanıcı adlarının sonuna ilgili domain adı eklenerek mail adresleri oluşturulur.
update Users set Email = UserName + '@domain.com'
Bütün kod: https://github.com/saitorhan/T-SqlExamples/blob/master/randomnames.sql