Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server SQL Server 2008和SQL Server 2012上的不同结果_Sql Server_Sql Server 2008_Sql Server 2012 - Fatal编程技术网

Sql server SQL Server 2008和SQL Server 2012上的不同结果

Sql server SQL Server 2008和SQL Server 2012上的不同结果,sql-server,sql-server-2008,sql-server-2012,Sql Server,Sql Server 2008,Sql Server 2012,在SQLServer2008上执行时,结果以随机顺序出现。但在SQLServer2012上执行时,结果的顺序与主表asc中的顺序相同 不知道我缺少什么。下面是我在SQLServer2008和SQLServer2012中运行的查询 insert into CategoryImage1(ImageId, categoryid, thumbnail, ImageName, GridviewImage, CreatedOn, ModifiedOn, Coordinates, ActiveFlag)

在SQLServer2008上执行时,结果以随机顺序出现。但在SQLServer2012上执行时,结果的顺序与主表asc中的顺序相同

不知道我缺少什么。下面是我在SQLServer2008和SQLServer2012中运行的查询

insert into CategoryImage1(ImageId, categoryid, thumbnail,
ImageName, GridviewImage, CreatedOn, ModifiedOn, Coordinates, ActiveFlag)
   select 
      imageid, categoryid, thumbnail, ImageName, 
      GridviewImage, CreatedOn, ModifiedOn, Coordinates, ActiveFlag 
   from 
      CategoryImage 
   order by 
      newid()
Per
newid()
的类型为
uniqueidentifier
,不保证顺序。引用文件

比较运算符可与uniqueidentifier值一起使用。 然而,排序不是通过比较数据的位模式来实现的 这两个值


所以在您的例子中,
orderbynewid()
基本上没有任何效果,必然会生成不一致的顺序。而是尝试按特定列排序,如执行
orderbyimageid

您的
SELECT
语句以返回行。查询优化器根据可用的索引、列统计信息等确定返回这些行的最有效方式。因此,这些行可能按表顺序,也可能按其他顺序。顺序是不确定的,可能取决于许多因素,包括可用内存、磁盘IO等

然后,结果按newid()排序。这是一个标量函数,因此按返回的顺序对每一行执行。有人请纠正我,如果我在这里是不正确的,但这将是零净影响(除了一些浪费的CPU周期)

然后将这些结果插入到目标表中

总之,SQL Server 2012以不同的顺序插入它们的原因是,它选择了不同的SQL Server 2008执行计划。这可能是由于优化器在2012年对计划进行加权的方式发生了变化,或者数据形状、“新鲜度”或列/索引统计、可用资源、服务器架构等方面存在差异


如果要按确定顺序插入列,请确保order by子句按源数据中的一个或多个唯一列进行排序。

如果要以新的随机顺序插入一组行,则需要存储随机值,以便在查询数据时可以按顺序使用它们确定结果顺序的排序依据

因此:

后来:

select imageid,categoryid,thumbnail,
ImageName,GridviewImage,CreatedOn,ModifiedOn,Coordinates,ActiveFlag
from CategoryImage1 order by NewRandomColumn

1:

除非指定order BY子句,否则不保证结果集中返回行的顺序


My emphasis

为什么要以随机顺序插入到表中?当然,在查询时应该进行任何随机性?另外,两台服务器上的索引(尤其是集群索引)是否相同?因此,问题在于优化器足够聪明,能够意识到
order by newid()
对于此插入没有任何意义(因为表本身就是无序的行包),因此避免了它?[即使是简单的更改也会造成麻烦][1]:讨论添加TempDb文件时的排序问题。可能与您的问题不完全相关[1]:@RowlandShaw我想从我的表中获得一条不重复的无序记录。为此,我认为将所有数据随机放入另一个表的过程SQL Server中的一个表(或任何其他严肃的RDBMS)没有固有的顺序(或“自然”或“系统”顺序或任何您可能称之为的顺序)。只有当您使用显式的
order BY执行
SELECT
操作时,您才能获得订单。OP期望以随机顺序输出,这在SQL Server 2008中发生,但在SQL Server 2008中没有2012@t-clausen.dk更新了帖子。链接现在应该可以工作了。@AnujTripathi,这里没有所谓的随机顺序。您可以按列排序,也可以不按列排序,在这种情况下,没有顺序保证。@Rahul有没有办法将无序记录从一个表放到另一个表中。@Rahul使用order by imageid,我将以Asc或Desc顺序获得结果。但是我希望记录按随机顺序排列,或者说shuffledit不会改变引用orderby中唯一列的内容clause@t-clausen.dk-如果在
ORDER BY
子句中指定具有唯一值的列(例如
ORDER BY ImageId
),则数据将按此顺序返回,然后以相同的顺序插入到目标表中。这就是我所说的“唯一列”,而不是具有重复值的内容。换句话说,你必须按照确定性的东西对数据进行排序,或者根据定义,你不知道数据的顺序。注意,非确定性和随机性之间有很大的区别。如果希望以随机顺序返回行,则需要引入随机性源,SQL Server无法为您这样做。为此,您至少需要一个UDF来返回一个伪随机数。关于随机性的全面讨论,以及为什么计算机不能提供真正的随机性(根据定义)远远超出了这个问题的范围。必须承认,这是一个非常好的想法。尝试了这个解决方案。但在SQLServer2012上的结果与以前相同earlier@MohitRakhra-你是否理解了每个人都在说的话-表中存储行的顺序是未定义的,因此在查询这组行的任何select上有一个
order BY
,以获得随机顺序是至关重要的?这引用了想象的桌子。更重要的是,它将混合每个插入的行(当有超过1个插入时),因此每个插入都将由以前的插入混合,这显然不是问题的意思。@MohitRakhra-这是许多人试图告诉你的。一个表没有固有的顺序,您可以依赖它。您可以获得的唯一保证是在查询这些行时使用
ORDER BY
子句。您的代码假设表中有一些您可以依赖的“顺序”。这是一个糟糕的假设。试图得到一个能恢复这一点的答案
select imageid,categoryid,thumbnail,
ImageName,GridviewImage,CreatedOn,ModifiedOn,Coordinates,ActiveFlag
from CategoryImage1 order by NewRandomColumn