Sql server 是否使用另一个表中的随机数据更新多行?

Sql server 是否使用另一个表中的随机数据更新多行?,sql-server,random,sql-update,Sql Server,Random,Sql Update,结合一些例子,我提出了以下查询字段和表名已匿名,希望我没有插入拼写错误 UPDATE destinationTable SET destinationField = t2.value FROM destinationTable t1 CROSS APPLY ( SELECT TOP 1 'SomeRequiredPrefix ' + sourceField as value FROM #sourceTable WHERE sourceField <> ''

结合一些例子,我提出了以下查询字段和表名已匿名,希望我没有插入拼写错误

UPDATE destinationTable
SET destinationField = t2.value
FROM destinationTable t1
CROSS APPLY (
    SELECT TOP 1 'SomeRequiredPrefix ' + sourceField as value
    FROM #sourceTable
    WHERE sourceField <> ''
    ORDER BY NEWID()
    ) t2
问题
当前,所有记录都会在destinationField中获得相同的值,值需要是随机的和不同的。我可能遗漏了一些东西。

这里有一个可能的解决方案。使用CTE根据随机顺序为两个表分配行号。使用该行号将表连接在一起,并相应地更新行

;WITH 
dt AS 
(SELECT *, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowNum
FROM dbo.destinationtable),
st AS
(SELECT *, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowNum
FROM dbo.#sourcetable)

UPDATE dt
SET dt.destinationfield = 'SomeRequiredPrefix ' + st.sourcefield
FROM dt
JOIN st ON dt.RowNum = st.RowNum
更新的解决方案

由于源表中的行数较少,所以我使用交叉连接来获得所有可能的结果。然后分配随机行号,每个目标字段只取一行

;WITH cte
AS
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY destinationfield ORDER BY NEWID()) AS Rownum
    FROM destinationtable
    CROSS JOIN #sourcetable
    WHERE sourcefield <> ''

)

UPDATE cte
SET cte.destinationfield = 'SomeRequiredPrefix ' + sourcefield
WHERE cte.Rownum = 1

SELECT * FROM dbo.destinationtable

这是更好的工作,但还没有做到它应该做的一切。数据是随机的,但sourcetable对目标表的记录要少得多,因此我考虑使用左外部联接,否则sourcetable会限制目标表中行更新的数量。尽管如此,保持sourceField的位置似乎很重要,因为sourceField中有很多源记录。但您确定它是更新dt吗?不更新destinationtable?在ST:3.000中,但实际上很多,其中sourceField=[空白字符串]。在DT~82.000中。现在,我选择了一个游标而不是一个查询。@TTT我添加了另一个可能的解决方案。通过这个解决方案,我得到了547行受影响的数据,而我应该得到82067行受影响的数据。另外,游标的执行时间是00:19,更新后的解决方案的执行时间是00:55,所以现在我将使用游标。