обновить таблицу со случайными значениями - PullRequest
1 голос
/ 20 октября 2010

У меня есть две таблицы, скажем, Table1 (Col1, Col2, Col3, Col4) и Table2 (Col1).

Я хочу обновить некоторые столбцы в таблице 1.

Для каждой строки в таблице1, где столбец Col1 заканчивается на «001» (предположим, что все значения имеют длину не менее 4).

1. Поместите случайное число из набора (10,20,30,40,50,60,70,80,90) в Col2.

2. Поместите случайное 9-значное число в Col3.

3. Поместите случайное значение из таблицы 2 Col1 в таблицу 1 Col4.

Как я могу это сделать?

Спасибо!

Ответы [ 5 ]

1 голос
/ 20 октября 2010

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 строки, который увеличивается .. Затем я создаю цикл, который запускает обновление статистики для каждой строки в отдельности.

Очень похоже накак будет работать курсор, но, надеюсь, быстрее.

1 голос
/ 20 октября 2010

Я думаю, это поможет вам начать правильный путь.

Составьте таблицу с образцами данных с увеличивающимися числами, которые соответствуют вашим потребностям.Вы можете использовать цикл, но таблица подсчета или рекурсивный CTE будет намного быстрее, если вы делаете много строк.Затем обновите соответствующие столбцы Table1 с примерами данных ORDER BY NEWID().Это будет случайным образом определять порядок выбора.

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

Вы также можете увидеть, будет ли Генератор данных RedGate работать на вас.Он у меня есть, но я никогда не использовал его.

0 голосов
/ 14 июня 2018

Я бы предпочел запустить приведенный ниже код и подождать некоторое время, чтобы запустить и обновить случайные значения

while 1=1
BEGIN
    UPDATE top (10) a
     SET  value =rand() * 100
    from (select top 10 * from 
            MyTable
     order by newid()
     ) a
END
0 голосов
/ 20 октября 2010

Я предпочитаю всегда использовать решение на основе множеств.Это решение, основанное на множестве, которое я разработал.Я проверил это, и он работает.

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
0 голосов
/ 20 октября 2010

Я склонен использовать что-то вроде этого:

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...;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...