【发布时间】:2012-02-27 12:23:49
【问题描述】:
考虑一张表tbl1 与ID 和Name。
一个表值参数params 和ID。
我需要复制 tbl1 中的行,其中 ID 包含在 params 中。
我正在尝试这样插入
insert into tbl1(Name,somevalues..)
select tbl1.Name, tbl1.somevalues..
from @params p
inner join tbl1 on tbl1.ID=p.ID -- here ID is identity (PK).
但是插入后发现插入的顺序不一样。如果我单独运行选择查询,它将显示基于@params (TVP) 的 ID。但是插入后使用的相同查询将以不同的方式执行。
TVP 中的订单/选择查询 - A 使用 Select Query 插入时的顺序 - B
A B
370294 370294
368702 368702
369157 368504
368914 368505
368505 368914
368504 369157
368508 368506
368506 368507
368507 368508
368912 368637
368637 368638
368638 368639
368639 368912
368915 368915
368641 368641
有些 ID 的顺序不同。
不同的订单会有什么问题?
如何以与 TVP 中相同的顺序插入值?
提前致谢。
【问题讨论】:
-
除非您使用显式
ORDER BY,否则DBMS 没有 的排序概念。在您的情况下,使用 SQL Server,在您的表上添加聚集索引将在物理上保证该字段的顺序。 -
SQL Server 表没有隐含的顺序 - 只有明确指定
ORDER BY子句才能得到有序的东西。 -
@marc_s 但是当单独在选择查询中时,它将按照 TVP 中的顺序返回结果。那么这怎么可能呢?
-
@Harie:如果您的
SELECT中没有ORDER BY- 任何订购均无保证。如果您需要订购 - 指定它 - 这是 ONLY 方式。
标签: sql-server sql-server-2008 tsql join inner-join