我正在尝试使用以下代码更新具有随机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()函数仅执行一次相同。
请帮忙。谢谢。
答案 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。这意味着每个语句调用一次,生成的值用于每个受影响的行。
每行都会调用其他函数。通常人们通常将RAND
与NEWID
一起用作随机数的替代,但我不建议这样做,因为这些随机数的分布可能很差。
有一个很好的功能专门用于生成随机数: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