我有一张桌子每晚都会被重写。我有两列需要使用一组值列表中的随机数填充。角度列需要填充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'
感谢。
答案 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,因为我们没有示例数据。