Sql-Server
在插入中使用隨機字元串變數
這是我第一次嘗試編寫程式碼。我正在嘗試開發程式碼,以隨機添加
first name
、last 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)
這樣,我需要手動更改
name1
andname2
。有沒有辦法在這個表的變數中使用另一個表的值?我不知道如何解釋,但我有一個名為
Adventureworks2008.person.person
(你們知道這個數據庫)的表,其中包含很多隨機名稱( Fields >FirstName
,LastName
),我想在我的@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 秒的時間。)