今天打算把客户管理做完
一、数据准备
多弄几条数据,好练习分页、搜索,要生成以上数据。随机名字、手机、ID(比如UserId只能1、2、4、6及对应的UserName)、Number(两位随机大写英文和3位数字)
1、随机名字。感谢博客园AngelLee2009的一篇文章给我启发,但是略复杂,改进了一下
DECLARE @firstNames VARCHAR(100)='芳海亮红君军俊江河湖波杰山燕阳洋涛斌彬宾微伟威薇刚倩' --保存名的集合 DECLARE @lastNames VARCHAR(100)='刘方王李赵孙钱胡易黄温丁周魏陈曾涂' --保存姓的集合 declare @i int = 1 while(@i <= 10) begin PRINT ( SUBSTRING(@lastNames, ABS(CHECKSUM(NEWID()))%LEN(@lastNames)+1,1) + SUBSTRING(@firstNames, ABS(CHECKSUM(NEWID()))%LEN(@firstNames)+1,1) + SUBSTRING(@firstNames, ABS(CHECKSUM(NEWID()))%LEN(@firstNames)+1,1) ) set @i = @i + 1 END
李宾江
赵刚倩
黄海刚
赵燕微
胡河洋
温斌俊
魏倩海
魏斌微
魏洋亮
易倩倩
循环内的随机数不能用RAND(),而要用GUID,取模配合SUBSTRING要注意+1
2、随机手机(13开头)
SELECT '13'+RIGHT(1000000000 + CONVERT(BIGINT,ABS(CHECKSUM(NEWID()))), 9)
位数大的话超过了int要注意转成bigint,checksum会产生负数,最好要用ABS(),试了一下本例中不用ABS也是可以的,因为有了一层RIGHT()
一般这种情况重复的可能性非常非常小,位数少还有可能,9位随机数几乎就不可能重复了。
如果在项目中正式使用,为避免重复,可以在要生成的列上设置唯一索引,并把“忽略重复键”设为“是”,这样插入重复键时,会跳过(而不是全部失败)
这里只是生成随机手机号测试,就无所谓了
3、UserId
只能生成1、2、4、6,然后根据ID去取UserName
DECLARE @userId VARCHAR(10) = '1246'; SELECT SUBSTRING(@userId, @random%LEN(@userId)+1,1)
4、其余的类似,但有个Profession有个14,两位数再用上面这种定义'abcd'再SUBSTRING(),就不大好使了
DECLARE @str varchar(50)='1,2,3,5,6,14'; IF(OBJECT_ID('tempdb..#tab') IS NOT NULL) DROP TABLE #tab CREATE TABLE #tab (code varchar(10)) WHILE CHARINDEX(',',@str)>0 BEGIN INSERT #tab (code) VALUES (LEFT(@str,CHARINDEX(',',@str)-1)) SET @str=STUFF(@str,1,CHARINDEX(',',@str),'') END IF(@str<>'') INSERT INTO #tab (code) VALUES (@str) SELECT TOP 1 code FROM #tab ORDER BY NEWID()
项目中有封装过split方法,那把逗号分隔的变成每行一条路据,就几行,挺好用的。
ORDER BY NEWID()可以随机得到第一行数据
declare @firstNames varchar(100) = '芳海亮红君军俊江河湖波杰山燕阳洋涛斌彬宾微伟威薇刚倩'; --保存名的集合 declare @lastNames varchar(100) = '刘方王李赵孙钱胡易黄温丁周魏陈曾涂'; --保存姓的集合 DECLARE @userId VARCHAR(10) = '1246'; DECLARE @number VARCHAR(50) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; DECLARE @gender VARCHAR(10) = '12'; DECLARE @email VARCHAR(10) = '1246'; DECLARE @address VARCHAR(10) = '1246'; DECLARE @category VARCHAR(10) = '135'; DECLARE @ageGroup VARCHAR(10) = '23456'; DECLARE @random BIGINT; /*********两位以上处理比较麻烦***********/ DECLARE @str varchar(50)='1,2,3,5,6,14'; IF(OBJECT_ID('tempdb..#tab') IS NOT NULL) DROP TABLE #tab CREATE TABLE #tab (code varchar(10)) WHILE CHARINDEX(',',@str)>0 BEGIN INSERT #tab (code) VALUES (LEFT(@str,CHARINDEX(',',@str)-1)) SET @str=STUFF(@str,1,CHARINDEX(',',@str),'') END IF(@str<>'') INSERT INTO #tab (code) VALUES (@str) /**************************************/ DECLARE @index INT=1; WHILE(@index<=100) BEGIN SET @random = ABS(CHECKSUM(NEWID())); --循环里有些随机数可以共用,如果不想共用,要再执行ABS(CHECKSUM(NEWID())) INSERT INTO Customer ( Name, Tel, UserId, Username, Number, Gender, Email, [Address], Category, Profession, AgeGroup, CreateTime ) VALUES ( ( SUBSTRING(@lastNames, @random%LEN(@lastNames)+1,1) + SUBSTRING(@firstNames, ABS(CHECKSUM(NEWID()))%LEN(@firstNames)+1,1) + SUBSTRING(@firstNames, ABS(CHECKSUM(NEWID()))%LEN(@firstNames)+1,1) ), ('13'+RIGHT(1000000000 + @random, 9)), ( SUBSTRING(@userId, @random%LEN(@userId)+1,1) ), (SELECT LoginName FROM GMSAccount.dbo.[User] WHERE ID=SUBSTRING(@userId, @random%LEN(@userId)+1,1)), ( SUBSTRING(@number, @random%(LEN(@number)-1)+1,2)+CONVERT(VARCHAR(20),@random%100+100)), ( SUBSTRING(@gender, @random%LEN(@gender)+1,1) ), ( SUBSTRING(@number, @random%LEN(@number)+1,1) + LOWER(SUBSTRING(@number, ABS(CHECKSUM(NEWID()))%LEN(@number)+1,1)) + LOWER(SUBSTRING(@number, ABS(CHECKSUM(NEWID()))%LEN(@number)+1,1)) + LOWER(SUBSTRING(@number, ABS(CHECKSUM(NEWID()))%LEN(@number)+1,1)) + LOWER(SUBSTRING(@number, ABS(CHECKSUM(NEWID()))%LEN(@number)+1,1))+'@MVC.com' ), '', ( SUBSTRING(@category, @random%LEN(@category)+1,1) ), (SELECT TOP 1 code FROM #tab ORDER BY NEWID()), ( SUBSTRING(@ageGroup, @random%LEN(@ageGroup)+1,1) ), GETDATE() ); SET @index=@index+1; END SELECT * FROM Customer --TRUNCATE TABLE Customer
如果有需要,还可以根据全国地名随机生成地址(至少到城市一级),Email中的姓名最好还要有意义的单词,这些改进暂时就不做了,反正是测试数据
最终得到结果,还是不错的,通过这次生成练习,学到了不少生成随机数据的技巧。共享出来,也希望路过的朋友能有收获
有个生成数据脚本,就可以更方便地练习增删改查了。
二、共享页的跳转后相关内容修改
还发现个问题,点击跳转视图后,还需要把左边菜单展现在当前视图,否则菜单只会展示默认的样子(因为是单纯bootstrap的代码)
研究了一下源码的js判断,是根据点击的href和当前跳转后的地址栏地址进行判断,感觉源码弄的有些复杂,效率也不高,想改进一下。
一晃又到了半夜了,明天再继续吧。。。