C# SQL Server:随机化行(洗牌ID)
有没有办法在SQL Server中随机化行 我不想以随机的方式检索行,我知道如何做到这一点 我想洗牌数据库中的行ID(例如,ID1将更改为ID27,ID27将更改为ID1) 我可以将所有记录复制到一个临时表中,截断原始表,并使用并行循环将记录从临时表插入到随机表中 有没有更简单的方法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
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
,您也可以更新它们。您还提到了“并行循环”我不明白为什么。你不需要显式循环来完成这项工作。实际上,你可以做得更好:以随机顺序将所有行复制到一个临时名称的新表中,删除原始表,重命名临时表。