Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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
C# SQL Server:随机化行(洗牌ID)_C#_Sql Server - Fatal编程技术网

C# SQL Server:随机化行(洗牌ID)

C# SQL Server:随机化行(洗牌ID),c#,sql-server,C#,Sql Server,有没有办法在SQL Server中随机化行 我不想以随机的方式检索行,我知道如何做到这一点 我想洗牌数据库中的行ID(例如,ID1将更改为ID27,ID27将更改为ID1) 我可以将所有记录复制到一个临时表中,截断原始表,并使用并行循环将记录从临时表插入到随机表中 有没有更简单的方法 ID是身份种子,自动递增这听起来是一个非常奇怪的要求。由于id是一个标识,您无法更改它,因此您必须交换该行上的所有其他数据,您可以使用以下方法: select a.id as old_id, b.* int

有没有办法在SQL Server中随机化行

我不想以随机的方式检索行,我知道如何做到这一点

我想洗牌数据库中的行ID(例如,ID1将更改为ID27,ID27将更改为ID1)

我可以将所有记录复制到一个临时表中,截断原始表,并使用并行循环将记录从临时表插入到随机表中

有没有更简单的方法


ID是身份种子,自动递增

这听起来是一个非常奇怪的要求。由于id是一个标识,您无法更改它,因此您必须交换该行上的所有其他数据,您可以使用以下方法:

select
  a.id as old_id,
  b.*
into #newdata
from
  (
    select 
      id, 
      row_number() over (order by id) as rn 
    from 
      data
  ) a
  join (
     select 
      *, 
      row_number() over (order by newid()) as rn 
    from 
      data
  ) b on a.rn = b.rn
这将创建一个临时表,其中包含新旧id号+表中的所有列。然后,可以使用此临时值更新原始表中的行的所有列。桌子


我真的不推荐这样做,尤其是如果有很多行的话。在执行此操作之前,您可能应该对表使用表级独占锁,以防万一。

对于您的情况,什么是ID?它是包含自动递增整数的列吗?这也是PK吗?出于好奇,请更具体一点,您为什么要这样做?ID是标识种子,自动递增(无PK)。您不能更新
identity
列-您只能插入覆盖
identity
机制的新值您自己的方法(将所有行复制到临时表,截断原始表,以随机顺序将所有行复制回来)非常有效(可能是最有效的),我会使用它,即使您的ID不是
IDENTITY
,您也可以更新它们。您还提到了“并行循环”我不明白为什么。你不需要显式循环来完成这项工作。实际上,你可以做得更好:以随机顺序将所有行复制到一个临时名称的新表中,删除原始表,重命名临时表。