SQL更新列,其中包含设置值列表中的随机数

时间:2017-01-19 20:07:34

标签: sql-server random newid

我有一张桌子每晚都会被重写。我有两列需要使用一组值列表中的随机数填充。角度列需要填充15,30,45,60,90,距离需要填充9,15,21。 insert语句最多可处理700条记录。

我尝试使用

创建临时表(@MyRandomVal1
select 15 union 
select 30 union 
select 45 etc...

然后使用(select top 1 val from @MyRandomVal1 order by newid())。这将为所有行填充具有相同随机数的列。似乎我可能需要遍历插入的行,因此它为每一行运行(select top 1 val from @MyRandomVal1 order by newid()),但是在我的研究中我已经读过,不建议使用循环。是否有另一种方法可以在插入期间从集合列表中随机抽样填充700多行?

以下是我现有的代码(仅适用于角度)。 SQL Server 2012。

DECLARE @MyRandomVal1 Table (
        id int identity (1,1),
        val int not null)

INSERT INTO @MyRandomVal1 (val)
    SELECT 15
    union
    SELECT 30
    union
    SELECT 45
    union
    SELECT 60
    union
    SELECT 90

INSERT INTO MyTable (AUTO_KEY,E3_KEY,EMPID,ENAME,COLOR,ANGLE)
    SELECT dbo.getautokey(),dbo.GetAutoKey(),[EMPID],[ENAME],abs(checksum(NewId()) % 256),(select top 1 val from @MyRandomVal1 order by newid())
    FROM MyTable2 WHERE [JOBLEVEL]='SVP'

感谢。

1 个答案:

答案 0 :(得分:0)

一种方法是使用cte。在true上加入@ MyRandomVal1到MyTable2。添加由newid()排序的行号。然后得到所有rownumber 1的。您需要检查PARTITION BY中的逻辑。我不知道是否有一个独特的专栏。如果不是,您可能必须按所有列进行分区,因为我们将每一行连接到随机值表中的每一行。

DECLARE @MyRandomVal1 Table (
        id int identity (1,1),
        val int not null)

INSERT INTO @MyRandomVal1 (val)
    SELECT 15
    union
    SELECT 30
    union
    SELECT 45
    union
    SELECT 60
    union
    SELECT 90

;WITH cte AS (
SELECT 
    dbo.getautokey() AS AUTO_KEY
  , dbo.GetAutoKey() AS E3_KEY
  , [EMPID]
  , [ENAME]
  , ABS(checksum(NewId()) % 256) AS COLOR 
  , a.val
  , ROW_NUMBER() OVER (PARTITION BY empid ORDER BY NEWID()) AS rn
FROM MyTable2
JOIN  @MyRandomVal1 a ON 1 = 1
WHERE [JOBLEVEL]='SVP')

INSERT INTO MyTable (AUTO_KEY, E3_KEY, EMPID,ENAME, COLOR, ANGLE)
    SELECT * FROM cte
    WHERE rn = 1

这是一个简单的DEMO,因为我们没有示例数据。