如何在联合选择中保持列值的顺序?

Rud*_*cht 1 t-sql sql-server

我正在使用SELECT和进行批量插入表UNION.我需要SELECT在调用时保持值的顺序不变INSERT,但似乎值是按升序插入的,而不是我指定的顺序.

例如,下面的insert语句

declare @QuestionOptionMapping table
(
    [ID] [int] IDENTITY(1,1)
  , [QuestionOptionID] int
  , [RateCode] varchar(50)
)

insert into @QuestionOptionMapping (
    RateCode
)
select
   'PD0116'
union
select
  'PL0090'
union
select
  'PL0091'
union
select
  'DD0026'
union
select
  'DD0025'

SELECT * FROM @QuestionOptionMapping
Run Code Online (Sandbox Code Playgroud)

将数据呈现为

(5 row(s) affected)
ID          QuestionOptionID RateCode
----------- ---------------- --------------------------------------------------
1           NULL             DD0025
2           NULL             DD0026
3           NULL             PD0116
4           NULL             PL0090
5           NULL             PL0091

(5 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

如何选择插入的数据返回与插入时相同的顺序?

Eri*_*ndt 5

SQL Server将您的行存储为无序集.数据点可能是也可能不是连续的,它们可能在或可能不在插入语句中指定数据的"顺序"中.

查询数据时,引擎将按优化程序确定的最有效顺序检索行.每次查询数据时,无法保证订单相同.

保证结果集顺序的唯一方法是在SELECT语句中包含显式ORDER BY子句.

请参阅此答案,以深入讨论为什么会出现这种情况.SELECT查询中的默认行顺序 - SQL Server 2008 vs SQL 2012

通过对INSERT语句使用SELECT/UNION选项,您将创建SQL Server作为集合而不是作为一系列输入进行摄取的无序集.如果需要将插入按顺序应用IDENTITY值,请将插入分隔为离散语句.更好的是,如果行编号很重要,请不要遗漏.显示插入行的行数.