如何随机更新行?

jco*_*lum 12 sql sql-server-2008

我想通过一张桌子随机删除一些数据.我正在做一些数据随机化,将真实的名字变成假的等等.其中一个表有一个列,大约40%的时间是空的.我的名字随机发生器应用程序可以在它分配新的名字时在其中的某处投掷硬币.但我最好只是在最后做:随机修剪一些数据.

我有这个代码,它不起作用,但看起来应该对我来说:

Use MyDb
go 

CREATE VIEW vRandNumber 
AS 
SELECT RAND() as RandNumber 

go  

CREATE FUNCTION RandNumber() 
RETURNS float 
AS 
  BEGIN 
  RETURN (SELECT RandNumber FROM vRandNumber) 
  END 

go  

select dbo.RandNumber()

update names set nickname = null 
where ((select dbo.RandNumber()) > 0.5)
Run Code Online (Sandbox Code Playgroud)

当我运行RandNumber函数时它很好,很随机.但是当我进行更新时,它会在一半时间内更新所有行,而在另一半时间内不会更新所有行.

我想让它在每次运行脚本时更新随机行数.我真的以为像RandNumber这样的函数会为表中的每一行运行一次.显然不是.

如果没有循环且没有控制台应用程序,这可能吗?

编辑:我也尝试了RAND()的几种变体直接在哪里得到相同的结果.

Ian*_*son 27

假设您的Names表有一个名为Id的主键字段,这将使随机50%的行中的昵称无效:

update dbo.Names set Nickname = null where Id in
(
    select top 50 percent id from dbo.Names order by NEWID()
)
Run Code Online (Sandbox Code Playgroud)

  • 拜托,来吧!超级性能真的是这种用例的问题吗?谈论过早优化.我刚刚在一个有182,770行的表上尝试过这种方法,它在11秒内运行. (9认同)