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

时间:2015-06-19 12:17:23

标签: sql-server sql-server-2008 sql-server-2012

在SQL Server 2008上执行时,结果按预期以随机顺序出现。但是在SQL Server 2012上执行时,结果的顺序与主表中的asc相同。

无法弄清楚我缺少的地方。这是我在SQL Server 2008和SQL Server 2012中运行的查询。

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()

3 个答案:

答案 0 :(得分:2)

执行{{1}}语句以返回行。查询优化器根据可用索引,列统计信息等确定返回这些行的最有效方法。因此,它们可以按表顺序或其他顺序排列。订单是不确定的,可能取决于许多因素,包括可用内存,磁盘IO等等。

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

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

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

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

答案 1 :(得分:0)

Documentation newid()类型为uniqueidentifier,订单无法保证。从文档中引用

  

比较运算符可与uniqueidentifier值一起使用。   但是,通过比较比特模式没有实现排序   这两个值。

因此,在您的情况下,order by newid()基本上没有任何影响,并且必然会产生不一致的顺序。而是尝试按order by imageid等特定列进行排序。

答案 2 :(得分:0)

如果你想要一个新的,随机的顺序的一组行,那么你需要存储随机值,这样你就可以在ORDER BY中使用它们>查询数据。 ORDER BY确定结果的顺序 1

所以:

create table CategoryImage1 (
   ... --Columns as before
   ,NewRandomColumn uniqueidentifier not null
)

insert into CategoryImage1(ImageId,categoryid,thumbnail,
ImageName,GridviewImage,CreatedOn,ModifiedOn,Coordinates,ActiveFlag,

NewRandomColumn)

select imageid,categoryid,thumbnail,
ImageName,GridviewImage,CreatedOn,ModifiedOn,Coordinates,ActiveFlag,

newid()

from CategoryImage

然后是:

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

1 ORDER BY

  

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

我的重点