隨機生成人員姓名(脫敏處理)-SQL Server版本

正常情況下的隨機生成人員姓名思路是先定義好姓和名,然後限定隨機數範圍,取對應的姓和名數組下標並拼接即可,這一篇帖子的處理方式也不例外。但sql server本身並沒有數組類型,所以我們需要找一個可以替代數組的方法。
已知的方法有實體表、臨時表、XML、截取字符串這幾種方式,他們各自適用於不同的場景,本帖子以實體表來代替數組(由使用者自行決定其生命週期)

--使用tempdb庫
use tempdb
go

if exists (select * from firstname)
drop table firstname
go

create table firstname(
firstname_id int identity primary key,
firstname_str char(4)
)
go
if exists (select * from lastname)
drop table lastname
go
create table lastname(
lastname_id int identity primary key,
lastname_str char(4)
)
go

--插入姓(百家姓不止百個,可根據自己需要拓展詞庫)
insert into firstname values
('趙'),('錢'),('孫'),('李'),('周'),('吳'),('鄭'),('王'),('馮'),('陳'),('褚'),('衛'),('蔣'),('沈'),('韓'),('楊'),
('朱'),('秦'),('尤'),('許'),('何'),('呂'),('施'),('張'),('孔'),('曹'),('嚴'),('華'),('金'),('魏'),('陶'),('姜'),
('戚'),('謝'),('鄒'),('喻'),('柏'),('水'),('竇'),('章'),('雲'),('蘇'),('潘'),('葛'),('奚'),('範'),('彭'),('郎'),
('魯'),('韋'),('昌'),('馬'),('苗'),('鳳'),('花'),('方'),('俞'),('任'),('袁'),('柳'),('酆'),('鮑'),('史'),('唐'),
('費'),('廉'),('岑'),('薛'),('雷'),('賀'),('倪'),('湯'),('滕'),('殷'),('羅'),('畢'),('郝'),('鄔'),('安'),('常'),
('樂'),('於'),('時'),('傅'),('皮'),('卞'),('齊'),('康'),('伍'),('餘'),('元'),('卜'),('顧'),('孟'),('平'),('黃'),
('和'),('穆'),('蕭'),('尹'),('姚'),('邵'),('湛'),('汪'),('祁'),('毛'),('禹'),('狄'),('米'),('貝'),('明'),('臧'),
('計'),('伏'),('成'),('戴'),('談'),('宋'),('茅'),('龐'),('熊'),('紀'),('舒'),('屈'),('項'),('祝'),('董'),('梁'),
('杜'),('阮'),('藍'),('閔'),('席'),('季'),('麻'),('強'),('賈'),('路'),('婁'),('危'),('江'),('童'),('顏'),('郭'),
('梅'),('盛'),('林'),('刁'),('鍾'),('徐'),('邱'),('駱'),('高'),('夏'),('蔡'),('田'),('樊'),('胡'),('凌'),('霍'),
('虞'),('萬'),('支'),('柯'),('昝'),('管'),('盧'),('莫'),('經'),('房'),('裘'),('繆'),('幹'),('解'),('應'),('宗'),
('丁'),('宣'),('賁'),('鄧'),('鬱'),('單'),('杭'),('洪'),('包'),('諸'),('左'),('石'),('崔'),('吉'),('鈕'),('龔'),
('程'),('嵇'),('邢'),('滑'),('裴'),('陸'),('榮'),('翁'),('荀'),('羊'),('於'),('惠'),('甄'),('曲'),('家'),('封'),
('芮'),('羿'),('儲'),('靳'),('汲'),('邴'),('糜'),('松'),('井'),('段'),('富'),('巫'),('烏'),('焦'),('巴'),('弓'),
('牧'),('隗'),('山'),('谷'),('車'),('侯'),('宓'),('蓬'),('全'),('郗'),('班'),('仰'),('秋'),('仲'),('伊'),('宮')

--插入名(此處僅用作拼接,還可以考慮做成名稱組合,僅需要修改函數中名稱的獲取部分代碼即可)
insert into lastname values
('嘉'),('哲'),('俊'),('博'),('妍'),('樂'),('佳'),('涵'),('晨'),('宇'),('怡'),('澤'),('子'),('凡'),('悅'),('思'),
('奕'),('依'),('浩'),('泓'),('彤'),('冰'),('媛'),('凱'),('伊'),('淇'),('淳'),('一'),('潔'),('茹'),('清'),('吉'),
('源'),('淵'),('和'),('函'),('妤'),('宜'),('雲'),('琪'),('菱'),('宣'),('沂'),('健'),('信'),('欣'),('可'),('洋'),
('萍'),('榮'),('榕'),('含'),('佑'),('明'),('雄'),('梅'),('芝'),('英'),('義'),('淑'),('卿'),('乾'),('亦'),('芬'),
('萱'),('昊'),('芸'),('天'),('嵐'),('昕'),('堯'),('鴻'),('棋'),('琳'),('孜'),('娟'),('宸'),('林'),('喬'),('琦'),
('丞'),('安'),('毅'),('凌'),('泉'),('坤'),('晴'),('竹'),('嫺'),('婕'),('恆'),('渝'),('菁'),('齡'),('弘'),('佩'),
('勳'),('寧'),('元'),('棟'),('盈'),('江'),('卓'),('春'),('晉'),('逸'),('沅'),('倩'),('昱'),('綺'),('海'),('聖'),
('承'),('民'),('智'),('棠'),('容'),('羚'),('峯'),('鈺'),('涓'),('新'),('莉'),('恩'),('羽'),('妮'),('旭'),('維'),
('家'),('泰'),('詩'),('諺'),('陽'),('彬'),('書'),('苓'),('漢'),('蔚'),('堅'),('茵'),('耘'),('喆'),('國'),('侖'),
('良'),('裕'),('融'),('致'),('富'),('德'),('易'),('虹'),('綱'),('筠'),('奇'),('平'),('蓓'),('真'),('之'),('凰'),
('樺'),('玫'),('強'),('村'),('沛'),('汶'),('鋒'),('彥'),('延'),('庭'),('霞'),('冠'),('益'),('劭'),('鈞'),('薇'),
('亭'),('瀚'),('桓'),('東'),('瀅'),('恬'),('瑾'),('達'),('羣'),('茜'),('先'),('洲'),('溢'),('楠'),('基'),('軒'),
('月'),('美'),('心'),('茗'),('丹'),('森'),('學'),('文')

--創建生成隨機數的視圖(因爲sql server中不允許使用newid和rand此類不確定值的函數,所以需要多一層封裝)
if OBJECT_ID('dbo.v_rand') IS NOT NULL
drop view v_rand
go
create view v_rand
as
select RAND() res
go

--創建供姓名生成函數用的隨機數獲取函數
if OBJECT_ID('dbo.fun_get_rand') IS NOT NULL
drop function fun_get_rand
go
create function fun_get_rand()
returns numeric(16, 15)
as
begin
  declare @res numeric(16, 15)
  select @res = res from v_rand
  return @res
end
go

--創建中文姓名隨機生成函數
if OBJECT_ID('dbo.fun_generate_chinese_name') IS NOT NULL
drop function fun_generate_chinese_name
go
create function fun_generate_chinese_name()
returns varchar(300)
as
begin
declare @result varchar(300)
--姓的詞庫中目前是240條記錄,所以寫死240,若後續拓展了需要修改這裏的值
select @result = rtrim((select firstname_str from firstname where firstname_id =ROUND(dbo.fun_get_rand()*(240-1)+1,0)))
--名的詞庫中目前有200條記錄,所以寫死200,若後續拓展了或者更換方式了,這裏也需要同步修改
+rtrim(ltrim((select lastname_str from lastname where lastname_id=ROUND(dbo.fun_get_rand()*(200-1)+1,0))))
+rtrim(ltrim((select lastname_str from lastname where lastname_id=ROUND(dbo.fun_get_rand()*(200-1)+1,0))))
return @result
end
go

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章