使用随机值更新表

时间:2010-10-20 12:30:36

标签: sql sql-server tsql random

我有两个表,比如Table1(Col1,Col2,Col3,Col4)和Table2(Col1)。

我想更新Table1中的一些col。

对于Table1中Col1以'001'结尾的每一行(假设所有值至少为长度为4),我想:

1.在Col2中放置一组随机数(10,20,30,40,50,60,70,80,90)。

2.在Col3中放置一个随机的9位数字。

3.从Table1 Col4中的Table2 Col1中放置一个随机值。

我该怎么做?

谢谢!

5 个答案:

答案 0 :(得分:1)

我认为这可以帮助你开始正确的道路。

构建一个样本数据表,其中包含适合您需求的递增数字。您可以使用循环,但如果您要执行多行,则tally tablea recursive CTE会更快。然后,使用示例数据Table1更新ORDER BY NEWID()的相应列。这将随机化选择集的顺序。

UPDATE Table1
SET  Col1 = (SELECT TOP 1 RandomColumn1
             FROM   SampleData
             ORDER BY NEWID())

您还可以看到 RedGate's Data Generator 是否适合您。我有它,但从未使用它。

答案 1 :(得分:1)

CREATE TABLE MyTable(      RowID int IDENTITY(1,1),
     Col1 int,      Col2 int,      Col3 int,      Col4 int。     )

DECLARE @RowCount int,
@numberRecords int

select @NumberRecords = count(*) from mytable
SET @RowCount = 1

WHILE @RowCount <= @NumberRecords
BEGIN

UPDATE MyTable
 SET  Col1 = (SELECT TOP 1 RandomColumn1 
         FROM   SampleData 
         ORDER BY NEWID()) 

 WHERE RowID = @RowCount


 SET @RowCount = @RowCount + 1
END

希望这是一些帮助...扩展我的答案..你可以看到我创建你的表,但添加一个递增的行id列。然后创建一个循环,在每行上运行更新语句行基础。

非常类似于光标的运行方式,但希望更快。

答案 2 :(得分:0)

我倾向于使用这样的东西:

WITH SampleData (entity_number, entity_name)
     AS (
         ... row constructors here...
        ),
     SampleDataOrdered (order_col, entity_number, entity_name)
     AS (
         SELECT ROW_NUMBER() OVER(ORDER BY NEWID()), 
                S1.entity_number, S1.entity_name
           FROM SampleData AS S1
        )
MERGE INTO MyBaseTable...;

答案 3 :(得分:0)

我更喜欢始终使用基于集合的解决方案。这是我开发的基于集合的解决方案。我测试了它并且它有效。

Update Table1
   Set Col2 = (Cast(CAST(newid() AS binary(1)) AS int) % 9 + 1) *10
 Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'

Update Table1
   Set Col3 = Cast(CAST(newid() AS binary(3)) AS int)
 Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'

Create table #temp1(tCol1 varchar(50), 
             tCol2 varchar(10),randomnum varchar(max) )

      Insert Into #temp1
      Select Table1.Col1,Table2.Col1,newid() as random1
        From Table1 
  Cross Join Table2 
       Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'

      Update Table1
         Set Table1.Col4 = tCol2
        From (
              Select tCol1,tCol2,a.randomnum 
                From (
                           Select Max(randomnum) As randomnum 
                             From #temp1 Group By tCol1
                     ) a 
           Left Join #temp1 On a.randomnum = #temp1.randomnum
             ) b  
          Inner Join Table1 On b.tCol1 = Table1.Col1

          Drop table #temp1

答案 4 :(得分:0)

我更愿意运行以下代码并等待一段时间来运行并更新随机值

while 1=1
BEGIN
    UPDATE top (10) a
     SET  value =rand() * 100
    from (select top 10 * from 
            MyTable
     order by newid()
     ) a
END