2010-01-07 39 views
4

SQL SERVER 2000:用随机数据随着NEWID()更新表无法正常工作

我有测试数据(10多万行)的表,我想用一些随机数据来更新从另一个表中的列值从另一张桌子。据this question,这就是我想:

UPDATE testdata 
SET type = (SELECT TOP 1 id FROM testtypes ORDER BY CHECKSUM(NEWID())) 

-- or even 
UPDATE testdata 
SET type = (SELECT TOP 1 id FROM testtypes ORDER BY NEWID()) 

然而,“类型”字段仍与所有行的值相同;任何想法我做错了什么?

[编辑] 我希望这个查询为每一行返回一个不同的值,但它并不:

SELECT testdata.id, (SELECT TOP 1 id FROM testtypes ORDER BY CHECKSUM(NEWID())) type 
FROM testdata 

-- however seeding a rand value works 
SELECT testdata.id, (SELECT TOP 1 id FROM testtypes ORDER BY CHECKSUM(NEWID()) + RAND(testdata.id)) type 
FROM testdata 

回答

4

你的问题是:你只选择单个值然后使用该单个值更新所有列

为了真正得到一个随机化,你需要做一步一步/循环的方法 - 我在SQL Server 2008中试过这个,但我认为它也应该在SQL Server 2000中工作:

-- declare a temporary TABLE variable in memory 
DECLARE @Temporary TABLE (ID INT) 

-- insert all your ID values (the PK) into that temporary table 
INSERT INTO @Temporary SELECT ID FROM dbo.TestData 

-- check to see we have the values 
SELECT COUNT(*) AS 'Before the loop' FROM @Temporary 

-- pick an ID from the temporary table at random  
DECLARE @WorkID INT 
SELECT TOP 1 @WorkID = ID FROM @Temporary ORDER BY NEWID() 

WHILE @WorkID IS NOT NULL 
BEGIN 
    -- now update exactly one row in your base table with a new random value 
    UPDATE dbo.TestData 
    SET [type] = (SELECT TOP 1 id FROM dbo.TestTypes ORDER BY NEWID()) 
    WHERE ID = @WorkID 

    -- remove that ID from the temporary table - has been updated 
    DELETE FROM @Temporary WHERE ID = @WorkID 

    -- first set @WorkID back to NULL and then pick a new ID from 
    -- the temporary table at random   
    SET @WorkID = NULL 
    SELECT TOP 1 @WorkID = ID FROM @Temporary ORDER BY NEWID() 
END 

-- check to see we have no more IDs left 
SELECT COUNT(*) AS 'After the update loop' FROM @Temporary 
1

你需要强制执行每行计算的新ID的选择..

这会做的伎俩

UPDATE testdata 
SET type = (SELECT TOP 1 id FROM testtypes ORDER BY outerTT*CHECKSUM(NEWID())) 
FROM testtypes outerTT