使用rand()函数更新具有随机9位数的多行

时间:2017-06-13 21:17:43

标签: sql sql-server sql-server-2014

我正在尝试使用以下代码更新具有随机9位数的多行。

fucntion getNegative(myArray)
    var count = 0;
    for(var i = 0; i < myArray.length(); i++)
    {
        if(myArray[i] < 0){
            count++
        }
    }
    return count;
}

预期结果:查询应使用300个随机9位数字更新300行。

实际:查询正在更新300行,其编号与run()函数仅执行一次相同。

请帮忙。谢谢。

3 个答案:

答案 0 :(得分:2)

正如您已经发现的那样,# Limit to only cat=Y df2 <- df1[which(df1$cat=='Y'),] # Order by descending df2 <- df2[order(-df2$value),] # Create a vector based on group column order_vector <- df2[,'group'] # Use vector from above to designate new factor levels df1$group <- factor(df1$group, levels = order_vector) # Sort output2 <- df1[with(df1, order(group, cat)), ] 在SQL Server中是run-time constant function。这意味着每个语句调用一次,生成的值用于每个受影响的行。

每行都会调用其他函数。通常人们通常将RANDNEWID一起用作随机数的替代,但我不建议这样做,因为这些随机数的分布可能很差。

有一个很好的功能专门用于生成随机数:CRYPT_GEN_RANDOM。它至少从SQL Server 2008开始提供。

它生成给定数量的随机字节。

在你的情况下,将随机数作为[0; 1]范围内的浮点值很方便,与CHECKSUM返回的值相同。

因此,RAND生成4个随机字节CRYPT_GEN_RANDOM(4)。 将它们转换为varbinary,除以32位整数的最大值(4294967295)并添加0.5以将范围从[-0.5; +0.5]移至[0; 1]:

int

您的查询变为:

(CAST(CRYPT_GEN_RANDOM(4) as int) / 4294967295.0 + 0.5)

答案 1 :(得分:1)

是的,rand()行只会在更新行之前执行一次,而不是每次更新行时都会执行。

您可以使用存储过程使用(CONVERT(NUMERIC(10,0),RAND() * 899999999) + 100000000)更新每一行。

答案 2 :(得分:1)

Sean Lange 100%正确。但是,如果您想快速屏蔽SSN,使用 HashBytes()可能会有所帮助。

示例

Declare @Table table (SSN varchar(25))
Insert into @Table values
('070-99-12345'),
('123-45-67890')

Select SSN
      ,AsInt = abs(cast(HashBytes('MD5', SSN) as int))
 From  @Table

<强>返回

SSN             AsInt
070-99-12345    508860145
123-45-67890    843256257