【问题标题】:How to generate random data in SQL server如何在 SQL Server 中生成随机数据
【发布时间】:2013-07-31 17:48:15
【问题描述】:

我想创建一个存储过程来在“视频”表中插入随机数据。我已经为 UserProfile 表生成了 30,000 条记录数据。

注意:用户名是视频表中的FK元素。

CREATE TABLE UserProfile 
(
  Username VARCHAR(45)  NOT NULL  ,
  UserPassword VARCHAR(45)  NOT NULL  ,
  Email VARCHAR(45)  NOT NULL  ,
  FName VARCHAR(45)  NOT NULL  ,
  LName VARCHAR(45)  NOT NULL  ,
  Birthdate DATE   ,
  Genger VARCHAR(10)  NOT NULL  ,
  ZipCode INT    ,
  Image VARCHAR(50)      ,

  PRIMARY KEY(Username)
);
GO

CREATE TABLE Video 
(
  VideoId INT  NOT NULL DEFAULT 1000 ,
  Username VARCHAR(45)  NOT NULL  ,
  VideoName VARCHAR(160)  NOT NULL  ,
  UploadTime DATE    ,
  TotalViews INT    ,
  Thumbnail VARCHAR(100)      ,

  PRIMARY KEY(VideoId),
  FOREIGN KEY(Username)
    REFERENCES UserProfile(Username)
);
GO

【问题讨论】:

  • 感谢它看起来很有用
  • @AaronBertrand 如果这是一个免费工具,我会同意你的看法,但它将近 400 美元!
  • @PhillipCopley 如果您和/或您的雇主不重视您的时间,并且您完全有能力以平等或更好的方式解决相同的问题,这只是一个问题。人们购买软件是有原因的——通常是因为这比编写自己的软件更具成本效益和/或免费版本不能满足所有要求。请阅读:The cost of reinventing the wheel.

标签: sql sql-server database sql-server-2008 stored-procedures


【解决方案1】:

生成随机数据并不太难,即使是在 SQL 中

例如,从您的 userprofile 表中获取随机用户名。

BEGIN
-- get a random row from a table
DECLARE @username VARCHAR(50)
SELECT @username = [Username] FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY [Username]) [row], [Username]
    FROM [UserProfile]
) t 
WHERE t.row = 1 + (SELECT CAST(RAND() * COUNT(*) as INT) FROM [UserProfile])

print(@username)
END

要生成一个随机整数...

BEGIN
-- get a random integer between 3 and 7 (3 + 5 - 1)
DECLARE @totalviews INT
SELECT @totalviews = CAST(RAND() * 5 + 3 as INT)
print(@totalviews)
END

生成随机的varchar字符串

BEGIN
-- get a random varchar ascii char 32 to 128
DECLARE @videoname VARCHAR(160)
DECLARE @length INT
SELECT @videoname = ''
SET @length = CAST(RAND() * 160 as INT)
WHILE @length <> 0
    BEGIN
    SELECT @videoname = @videoname + CHAR(CAST(RAND() * 96 + 32 as INT))
    SET @length = @length - 1
    END
print(@videoname)
END

最后,随机日期

BEGIN
-- get a random datetime +/- 365 days
DECLARE @uploadtime DATETIME
SET @uploadtime = GETDATE() + (365 * 2 * RAND() - 365)
print(@uploadtime)
END

【讨论】:

    【解决方案2】:

    正如 Aaron 在他的评论中已经建议的那样——我不会真的重新发明轮子。

    去寻找一些已经可用的工具。

    Here 是一篇关于如何在 VS 中执行此操作的文章,并在 StackOverflow 上讨论。

    Data generators for SQL server?

    【讨论】:

      【解决方案3】:
          declare @i int
          set @i = 0 
          while (@i < 7)
      
      
          Begin
      
          BEGIN
          -- get a random row from a table
          DECLARE @username VARCHAR(50)
          DECLARE @length INT
          SELECT @username = ''
          SET @length = CAST(RAND() * 50 as INT)
          WHILE @length <> 0
              BEGIN
              SELECT @username = @username + CHAR(CAST(RAND() * 96 + 32 as INT))
              SET @length = @length - 1
              END
          END
      
      
          BEGIN
          -- get a random integer between 3 and 7 (3 + 5 - 1)
          DECLARE @totalviews INT
          SELECT @totalviews = CAST(RAND() * 5 + 3 as INT)
          print(@totalviews)
          END
      
          BEGIN
          -- get a random varchar ascii char 32 to 128
          DECLARE @videoname VARCHAR(160)
      
          SELECT @videoname = ''
          SET @length = CAST(RAND() * 160 as INT)
          WHILE @length <> 0
              BEGIN
              SELECT @videoname = @videoname + CHAR(CAST(RAND() * 96 + 32 as INT))
              SET @length = @length - 1
              END
          END
      
          BEGIN
          -- get a random datetime +/- 365 days
          DECLARE @uploadtime DATETIME
          SET @uploadtime = GETDATE() + (365 * 2 * RAND() - 365)
          END
      
          insert into table_1 values(@videoname, @username, @totalviews, @length, @uploadtime)
          SET @i = @i + 1
          end
      

      【讨论】:

      • 请添加一些描述来解释答案。
      【解决方案4】:

      http://www.generatedata.com/#generator 这很棒。将您限制为 300 行左右。但是,效果很好。付费版本产生更多数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-10
        • 2019-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-02
        • 2016-01-11
        • 1970-01-01
        相关资源
        最近更新 更多