摘要:
最近在做一个项目需要一些假数据所以需要sql做一个存储过程来定时的生产一些假数据。这个假数据需要产生一个用户名 和 一个条例(这个条例由指定的6条中产生)
假数据是要这样产生的:将假数据放在字符串中在这个字符串中使用逗号将指定的一部分(可以用特殊字符分割开),随后使用随机数来得到。
由于惯性编程想法就是将这些用户名和这6条规定用数组来存储,在产生随机数通过随机数当作数组的索引值,这样自然而然的就可以水到渠成了。但是后来发现在mssql中没有数组的这种概念,所以这个念头就失败而告终。
思来想去想到了两种方法:
- 使用SUBSTRING来截取字符串
- 将字符串转换成XML格式再通过XML转换成TABLE
一、使用SUBSTRING来截取字符串
用到的是mssql中的SUBSTRING方法。举个例子比如我现在有一个字符串【我来自中国】
思路是先产生一个随机数RAND介于1到这个字符串长度的值,让后在通过SUBSTRING进行截取指定的长度。
DECLARE @str NVARCHAR(20),@split varchar(10),@idx INT; SET @split = ','; SET @str = N'我来自中国'; SET @idx= CEILING(RAND()*((LEN(@str)))) PRINT '随机数:'+ CONVERT(NVARCHAR,@idx); PRINT '结果:'+ SUBSTRING(@str,@idx,1)
二、将字符串转换成XML格式再通过XML转换成TABLE
用这个方法思路如下:
- 将这个字符串指定要筛选出来的字符或字符串用特殊字符来分割开。
- 将这个字符串转成XML格式,中间使用到了mssql的REPLACE方法。
- 在将XML转化成TABLE在用随机数去表中筛选。
DECLARE @str NVARCHAR(20),@split varchar(10),@idx INT,@x XML; DECLARE @t TABLE(id INT IDENTITY(1,1), c1 NVARCHAR(100)); SET @split = ','; SET @str = N'我,来,自,中,国'; SET @x = CONVERT(XML,'<items><item id="'+REPLACE(@str,@split,'"/><item id="') + '"/></items>') INSERT INTO @t SELECT x.item.value('@id[1]', 'NVARCHAR(100)') FROM @x.nodes('/items/item') AS x(item) SET @idx= CEILING(RAND()*((LEN(@str)))) SELECT @x SELECT * FROM @t SELECT * FROM @t WHERE id = @idx
三、使用NEWID()方法
要使用NWEID()方法的前提是要在第二个方法的将字符串转换成table下在使用NEWID()方法随机出一条记录即可
SELECT TOP 1 * FROM @t ORDER BY NEWID()