• 22 Eylül 2020 13:39

Sait ORHAN

Öğretmek için Öğrenin- Öğrenmek için Öğretin

T-SQL Gerçek Ad ve Soyadlarından Rastgele Veri Üretmek

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

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.