最近在做一个项目需要一些假数据所以需要sql做一个存储过程来定时的生产一些假数据。这个假数据需要产生一个用户名 和 一个条例(这个条例由指定的6条中产生)

        假数据是要这样产生的:将假数据放在字符串中在这个字符串中使用逗号将指定的一部分(可以用特殊字符分割开),随后使用随机数来得到。

        由于惯性编程想法就是将这些用户名和这6条规定用数组来存储,在产生随机数通过随机数当作数组的索引值,这样自然而然的就可以水到渠成了。但是后来发现在mssql中没有数组的这种概念,所以这个念头就失败而告终。

        思来想去想到了两种方法:

  1.     使用SUBSTRING来截取字符串
  2.     将字符串转换成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

        用这个方法思路如下:

  1.  将这个字符串指定要筛选出来的字符或字符串用特殊字符来分割开。
  2.  将这个字符串转成XML格式,中间使用到了mssql的REPLACE方法。
  3.  在将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()