首页 文章

使用随机值更新表

提问于
浏览
1

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

我想更新Table1中的一些cols .

对于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

    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列 . 然后我创建一个循环,在每行的行上运行更新语句 .

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

  • 0

    我想这可以让你开始走正确的道路 .

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

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

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

  • 2

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

    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...;
    
  • 1

    我宁愿更喜欢运行下面的代码并等待一段时间来运行和更新随机值

    while 1=1
    BEGIN
        UPDATE top (10) a
         SET  value =rand() * 100
        from (select top 10 * from 
                MyTable
         order by newid()
         ) a
    END
    
  • 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
    

相关问题