Sql 如何用20个随机选择的值更新10000条记录?

Sql 如何用20个随机选择的值更新10000条记录?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,如何用20个随机选择的值更新10000条记录 示例:在一个表中,我有像firstname、lastname、emailid这样的字段,它有10000条记录。我想用我拥有的测试电子邮件id列表更新电子邮件id字段。以下是一个示例: declare @EmailList table ( EmailIndex int identity(1, 1) primary key, EmailAddress nvarchar(100) ) insert @EmailList (EmailAdd

如何用20个随机选择的值更新10000条记录

示例:在一个表中,我有像firstname、lastname、emailid这样的字段,它有10000条记录。我想用我拥有的测试电子邮件id列表更新电子邮件id字段。

以下是一个示例:

declare @EmailList table
(
    EmailIndex int identity(1, 1) primary key,
    EmailAddress nvarchar(100)
)

insert @EmailList (EmailAddress)
    select 'email1@mailserver.com' union all
    select 'email2@mailserver.com' union all
    select 'email3@mailserver.com'
    -- other emails here...

declare @emailListLength int
select @emailListLength = count (*) from @EmailList

update Users set Email = el.EmailAddress
    from
       (select CEILING(RAND(CONVERT(varbinary, newid())) * @emailListLength) as randomEmailIndex, * from Users) rnd
          join @EmailList el on el.EmailIndex = rnd.randomEmailIndex
上限(RAND(CONVERT(varbinary,newid())
表达式将生成从
1
[email list length]
的随机数,然后我们使用此随机索引将用户表与预定义的枚举电子邮件列表连接起来。

以下是一个示例:

declare @EmailList table
(
    EmailIndex int identity(1, 1) primary key,
    EmailAddress nvarchar(100)
)

insert @EmailList (EmailAddress)
    select 'email1@mailserver.com' union all
    select 'email2@mailserver.com' union all
    select 'email3@mailserver.com'
    -- other emails here...

declare @emailListLength int
select @emailListLength = count (*) from @EmailList

update Users set Email = el.EmailAddress
    from
       (select CEILING(RAND(CONVERT(varbinary, newid())) * @emailListLength) as randomEmailIndex, * from Users) rnd
          join @EmailList el on el.EmailIndex = rnd.randomEmailIndex

上限(RAND(CONVERT(varbinary,newid())
表达式将生成从
1
[电子邮件列表长度]的随机数
然后我们使用此随机索引将用户表与预定义的枚举电子邮件列表连接起来。

感谢Tomek指出原始答案中的错误和冗余

UPDATE PersonalInformation
SET    EmailID = ABS(CAST(NEWID() AS BINARY(6)) % 20)

感谢Tomek指出原始答案中的错误和冗余

UPDATE PersonalInformation
SET    EmailID = ABS(CAST(NEWID() AS BINARY(6)) % 20)

不,用20个值随机更新所有10000行不,用20个值随机更新所有10000行+1我喜欢你在@EmailList上加入的方式。我可能会尝试用row_number()覆盖(按校验和(*)排序)或类似的方式。+1我喜欢你在@EmailList上加入的方式。我可能会尝试用row_number()覆盖(按校验和(*)排序)或者类似的。你测试过吗?这是错误的,select子查询只优化并执行了一次,所以EMAlid将填充相同的值。@Tomek-我添加了一个测试脚本,在我的电脑上,该脚本更新为从测试列表中随机选择的值。因此,如果你尝试用re替换表变量,我们都学到了一些新的东西规则表它的行为不同。@Tomek-你说得对,这是出乎意料的。我已经更改了答案。@Diego,
NEWID
函数在按
顺序使用时,对其当前形式的每一行执行一次(与原始答案相同),它被优化了。您测试过吗?这是错误的,select子查询被优化并只执行了一次,因此EMAlid将被填充相同的值。@Tomek-我添加了一个测试脚本,在我的电脑上,该脚本更新为从测试列表中随机选择的值。因此,如果您尝试用reg替换表变量,我们都学到了一些新的东西它的行为不同。@Tomek-你说得对,这是出乎意料的。我已经更改了答案。@Diego,
NEWID
函数在当前形式的每一行中执行一次,而在
ORDER BY
中使用时(与原始答案一样),它被优化掉了。