Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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 2012 - Fatal编程技术网

Sql 更改了同一表中行的顺序

Sql 更改了同一表中行的顺序,sql,sql-server-2012,Sql,Sql Server 2012,我的情况很复杂。有一个父数据库P,然后有另一个数据库C,我听说它与P相同(都是SQL Server 2012)。它们都在不同的服务器上。我正在对P和C进行select*表格a。检索到的数据完全相同,但顺序不同。这两个表具有相同的元数据。可能的原因是什么 编辑1 问题是,我有一个从我的客户机得到的存储过程,它在p上运行,然后在SSRS报告中使用。我没有访问P或报告的权限。我正在C上运行相同的存储过程。那就是当我得到相同的行,但顺序不同。在运行C的存储过程中,除了已经存在的子句外,没有添加其他ord

我的情况很复杂。有一个父数据库
P
,然后有另一个数据库
C
,我听说它与
P
相同(都是SQL Server 2012)。它们都在不同的服务器上。我正在对
P
C
进行
select*表格a
。检索到的数据完全相同,但顺序不同。这两个表具有相同的元数据。可能的原因是什么

编辑1

问题是,我有一个从我的客户机得到的存储过程,它在
p
上运行,然后在SSRS报告中使用。我没有访问
P
或报告的权限。我正在
C
上运行相同的存储过程。那就是当我得到相同的行,但顺序不同。在运行
C
的存储过程中,除了已经存在的子句外,没有添加其他
order by
子句。如果数据库相同,数据相同,表结构也相同,为什么行的显示顺序会不同

编辑2

tableA

COL1       COL2       COL3       COL4
---------- ---------- ---------- ----------
100        C          1          2015-01-01
101        A          2          2015-01-05
102        A          2          2014-01-01
103        B          4          2011-09-01
104        C          1          2015-01-01
如果在上述
表格a
COL1
主键
),我按COL2、COL3、COL4从表格a中选择*,然后:

p

COL1       COL2       COL3       COL4
---------- ---------- ---------- ----------
102        A          2          2014-01-01
101        A          2          2015-01-05
103        B          4          2011-09-01
100        C          1          2015-01-01
104        C          1          2015-01-01
结果显示在
C

COL1       COL2       COL3       COL4
---------- ---------- ---------- ----------
102        A          2          2014-01-01
101        A          2          2015-01-05
103        B          4          2011-09-01
104        C          1          2015-01-01
100        C          1          2015-01-01
这就是问题所在


PS-DBs的排序规则发生变化

除非为表指定
主键
,否则严格来说,不会定义数据的列出顺序。在MSSQL中,通常有一个“内部”顺序,对于每个表来说似乎都是可复制的,但是,正如您所观察到的,对于两个不同服务器上的“相同”表来说,这很可能是不同的。如果要在两台服务器上为表建立相同的顺序,应:

  • 引入主键
  • 或者始终使用
    选择
    按顺序

即使两个表具有相同的元数据;从您的帖子可以看出,您在查询中没有使用
orderby
子句,也没有使用
orderby
;无法保证返回结果的顺序

即使在同一台服务器上多次运行查询,也可能会观察到结果输出中数据的不同顺序

为了确保这一点,在查询时始终使用
orderby子句

select * from tableA order by some_column

如其他答案中所述,除非您指定一个
顺序,否则SQL Server可以并且很可能以任意顺序返回结果。实际原因是实现细节,取决于SQL Server在编译查询时使用的查询优化决策

试试这个。在返回结果的查询结束时,添加查询提示
选项(maxdop 1)
。然后对这两个数据库进行查询。结果是否以相同的顺序返回

这个。如果SQL Server计算查询的巨大成本,它可能会选择并行运行查询(取决于MAXDOP Server选项和查询提示)。当查询并行运行时,不同的线程可能会在其他线程之前提供结果,并且每次运行的结果顺序可能不同

如果没有
orderby
子句,查询顺序也可以取决于查询计划。影响查询计划的任何内容都会影响查询顺序。这方面的一个例子是。例如,以查询为例,
select*from[Addresses],其中[Country]=“luxen”
。此查询可能使用索引查找,然后使用书签查找来返回结果,因为卢森堡的人口与地址数量相比相当少。这可能导致按
[Country]
索引排序的行

现在,尝试从[Addresses]中选择[Country]=“China”
。此查询可能使用表扫描,因为该查询将返回所有列,并且扫描表的成本可能低于对
[Country]=“China”
进行索引查找,然后执行查询。此查询可能按磁盘上数据的物理顺序排序。除非您指定了一个order by子句,否则没有任何担保

更新


您提供了一个示例查询和模式。
orderbycol2、COL3、COL4
子句将保证结果按这3列排序。但是,如果这3列中有重复的值,则不能保证以一致的顺序返回这些行。如果这对您很重要,则必须修改
order by
子句以包含主键。

主键(甚至不是集群主键)保证
select
集合的顺序,而不使用
order by
。除非
orderby
子句指定排序,否则结果集是无序的。你可能会发现这篇文章很有趣:@BhupeshC,这正是答案中所说的;如果没有订购方,则无法保证订单。如果可以保证订单,则无需执行
订单。如果您有权访问在
P
上运行的报告/过程;多次运行该过程,查看结果数据的顺序是否完全不同。如果愿意,您可以在问题中发布过程代码正文。sp中已经指定了
order by
子句。该报告已在
P
上运行多次。顺序不变。在
C
上运行时,也不会更改为
C
上已经出现的顺序。更多信息请参见我的编辑。
orderbycol2,COL3,COL4
正在做它应该做的事情。只有PK列
COL1
的顺序不同。如果您在这两台机器中都按col1执行
订单
,该怎么办?如果是feas,您可以发布一次表架构吗