0

我有一张每晚都会重写的表格。我有两列需要用一组值列表中的随机数填充。角度列需要填充 15,30,45,60,90,距离需要填充 9,15,21。插入语句最多可以处理 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 服务器 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'

谢谢。

4

1 回答 1

0

一种方法是使用 cte。将您的 @MyRandomVal1 加入到 MyTable2 为 true。添加一个按 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

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

于 2017-01-19T22:20:55.137 回答