正常情况下的随机生成人员姓名思路是先定义好姓和名,然后限定随机数范围,取对应的姓和名数组下标并拼接即可,这一篇帖子的处理方式也不例外。但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