2011-09-08 82 views
2

我有一個包含具有所有NULL值的列的表。我想用給定的一組數字中的隨機數來填充這一列。如何從SQL中的一組數字中選擇隨機數

給定數字的集合將從SELECT語句中生成,該SELECT語句從其他表中選擇這些數字。

E.G:

UPDATE tableA 
SET someColumnName = SomeRandomNumberFromSet(SELECT number from tb_Numbers) 

這種使用2008 MSSQL如何做到?

+0

你想允許可能的重複嗎?即每個'someColumnName'從tb_Numbers中隨機選擇「pick」?此外,這些數字連續完全是任意的。 –

+0

@Martin Smith:是的,可以使用重複。 – Draco

+0

你有多少個數字?要更新多少行?你可以在數字表中添加一個序列號列來生成一個在該範圍內的隨機數,並查找特定的匹配行,而不是反覆按'newid()' –

回答

4

以下不是特別有效,但有效。該視圖需要繞過「在函數中無效使用副作用運算符'newid'」。錯誤。 UDF被假定爲非確定性的,因此將總是對每一行重新評估。

這樣可以避免SQL Server將假脫機程序添加到計劃中並重播早期結果的任何問題。

如果要更新的行數(或集合中的數字)大得多,我不會使用此方法。

CREATE VIEW dbo.OneNumber 
AS 
SELECT TOP 1 number 
      FROM master..spt_values 
      ORDER BY NEWID() 

GO 

CREATE FUNCTION dbo.PickNumber() 
RETURNS int 
AS 
BEGIN 
    RETURN (SELECT number FROM dbo.OneNumber) 
END 

GO 

DECLARE @tableA TABLE (someColumnName INTEGER) 
INSERT INTO @tableA VALUES (2), (2), (2), (2), (2) 

UPDATE @tableA 
SET  someColumnName = dbo.PickNumber() 

SELECT * FROM @tableA