Sql-Server

在插入中使用隨機字元串變數

  • September 25, 2015

這是我第一次嘗試編寫程式碼。我正在嘗試開發程式碼,以隨機添加first namelast name和。date

我現在有這個:

declare @date date,
       @val1 int,
       @val2 int
set @date = convert(date,dateadd(day, (abs(CHECKSUM(newid())) % 3650) * -1, getdate()))

   insert into tblexecution ( fname,lname,brtday )
   values ('name1','Name2',@date)

這樣,我需要手動更改name1and name2

有沒有辦法在這個表的變數中使用另一個表的值?我不知道如何解釋,但我有一個名為Adventureworks2008.person.person(你們知道這個數據庫)的表,其中包含很多隨機名稱( Fields > FirstNameLastName),我想在我的@val1@val2變數中使用這些值像這樣:

declare @date date,
       @val1 int,
       @val2 int
set @date = convert(date,dateadd(day, (abs(CHECKSUM(newid())) % 3650) * -1,
getdate()))

   insert into tblexecution ( fname,lname,brtday )
   values (@val1,@val2,@date)

所以我只是循環(或按 f5 很多)。

編輯1:

有了這個,我至少有一個隨機整數:

select right(rand(),2)

編輯2:

我可以這樣做,但我認為這是一項糟糕的工作:

insert into  execution..tblexecution
select distinct  firstname, lastname,
   convert(date,dateadd(day, (abs(CHECKSUM(newid())) % 3650) * -1,getdate())) as brtday
   from adventureworks2008.person.person

編輯3:

我可以這樣做:

declare @date date,
       @val1 nvarchar(200),
       @val2 nvarchar(200)
set @date = convert(date,dateadd(day, (abs(CHECKSUM(newid())) % 3650) * -1, getdate()));
set @val1=(select  top 1 firstname
              from adventureworks2008.person.person
             order by newid() );
set @val2=(select top 1 lastname
              from adventureworks2008.person.person
             order by newid() )

   insert into tblexecution ( fname,lname,brtday )
   values (@val1,@val2,@date)

這是在查詢中使用隨機變數的最佳方式嗎?

首先,根據您的問題,@byrdzeye 是最佳答案。假設您不需要將名字和姓氏隨機放在一起。

如果你特別需要每列是隨機的,你可以嘗試這樣的事情:

-- Set up a temp table to insert into
SELECT TOP 0 firstname fname, lastname lname, getdate() AS brtday 
   INTO #tblexecution 
FROM [Person].[Person]

-- Actual code
DECLARE @Rows INT = 1000

INSERT INTO #tblexecution (fname, lname, brtday)
SELECT 
    f.[FirstName] ,l.[LastName]
   ,convert(date, dateadd(day, (abs(CHECKSUM(newid())) % 3650) * - 1, getdate()))
FROM (SELECT TOP (@Rows) row_number() OVER (ORDER BY newid()) AS Id, firstname 
         FROM [Person].[Person]) f
JOIN (SELECT TOP (@Rows) row_number() OVER (ORDER BY newid()) AS Id, lastname 
         FROM [Person].[Person]) l
   ON f.id = l.id

這在我的測試中表現非常好,並且可以很好地擴展到 Adventureworks 的極限。(不到 2 萬個名字在我的盒子上用了不到 1 秒的時間。)

引用自:https://dba.stackexchange.com/questions/115810