Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用随机值更新表_Sql_Sql Server_Tsql_Random - Fatal编程技术网

Sql 使用随机值更新表

Sql 使用随机值更新表,sql,sql-server,tsql,random,Sql,Sql Server,Tsql,Random,我有两张表,比如说表1(Col1,Col2,Col3,Col4)和表2(Col1) 我想更新表1中的一些COL 对于表1中Col1以“001”结尾的每一行(假设所有值至少为长度4),我想: 1.将集合(10,20,30,40,50,60,70,80,90)中的随机数放入Col2 2.在Col3中放置一个随机的9位数字 3.将表2 Col1中的随机值放入表1 Col4中 我该怎么做 谢谢 我认为这可以让你走上正确的道路 构建一个样本数据表,其中的数字递增,以满足您的需要。您可以使用循环,但如果您要

我有两张表,比如说表1(Col1,Col2,Col3,Col4)和表2(Col1)

我想更新表1中的一些COL

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

1.将集合(10,20,30,40,50,60,70,80,90)中的随机数放入Col2

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

3.将表2 Col1中的随机值放入表1 Col4中

我该怎么做


谢谢

我认为这可以让你走上正确的道路

构建一个样本数据表,其中的数字递增,以满足您的需要。您可以使用循环,但如果您要做许多行,则or将快得多。然后,使用示例数据
ORDER BY NEWID()
更新
表1
的相应列。这将随机化选择集的顺序

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

您还可以查看是否适合您。我有,但从未使用过。

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

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...;
创建表MyTable( RowID int标识(1,1),
Col1 int, Col2 int, Col3 int, Col4 int。 )

DECLARE@RowCount int,
@数字记录int
从mytable中选择@NumberRecords=count(*)
设置@RowCount=1

而@RowCount我更喜欢使用基于集合的解决方案。这是我开发的基于集合的解决方案。我对它进行了测试,效果良好

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

我更愿意运行下面的代码,等待某个时间运行并更新随机值

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

除非使用top1,否则不能在子查询中使用order by子句,这将导致在每个记录中放置相同的随机值。@kralco,添加
TOP 1
不会在每个字段中放置相同的值,因为指定了
order by NEWID()
。但是,我正在根据您的其他观察结果进行修改(在没有
TOP的子查询中不能有
ORDER BY
)@kralco,我明白了;这一定是因为
TOP 1
查询只执行了一次。当我只测试那条语句时,每次执行我都会收到不同的结果。@kralco,在处理解决方案时,我遇到了很多限制,需要创建很多依赖项(
计数表
视图
,用于获取
NEWID()
,一个生成随机数的
函数)。我会去别处看看;抱歉,我无法帮助。Top 1查询将只运行一次,并根据返回的值更新列。在我的脑海中,你可以创建一个RowID列(递增的数字)来获取列的最小/最大值,在这里,你的更新和使用while 1:1循环,每次递增一个计数器变量,直到你达到与max row-id相同的值。我正在试着弄明白你的意思。你能说得更具体些吗?如何使用表2 col1中的随机值更新表1 col4?谢谢在你发布这篇文章之前,我开发了一个基于集合的解决方案。非常感谢你的帮助+1“这是基于集合的解决方案”:您正在使用三个更新和一个暂存表。呃,这不是一种程序性的方法吗?因为我只更新了350行,所以我觉得没有必要合并成一个步骤。但我当然可以,如果这对某人有帮助的话。。。也。除非使用With table…,否则暂存台是不可避免的。。。。无论哪种方式,临时表或表变量或它的调用在逻辑上都是相同的。必须多次引用非确定性查询的同一实例。你必须把它保存在某个地方。。。
while 1=1
BEGIN
    UPDATE top (10) a
     SET  value =rand() * 100
    from (select top 10 * from 
            MyTable
     order by newid()
     ) a
END