Sql server 防止在SQL Server中自动排序

Sql server 防止在SQL Server中自动排序,sql-server,tsql,Sql Server,Tsql,我正在尝试运行以下查询: Select * From table Where ID In ('100', '20', '222', '1', '15') 当我运行以下查询时,结果集按ID顺序返回。 ID是主键 如何确保按中指定的顺序返回结果集。当您有主键时,数据将根据主键进行排序和存储。实际上,在主键后面,SQLServer创建了一个。聚集索引的一个特点是数据总是基于它进行物理排序 如果需要按自定义顺序显示数据,则需要使用order By进行指定 @Brad当前提供了一个示例查询,该查询

我正在尝试运行以下查询:

Select * 
From table 
Where ID In ('100', '20', '222', '1', '15') 
当我运行以下查询时,结果集按ID顺序返回。 ID是主键


如何确保按中指定的顺序返回结果集。

当您有主键时,数据将根据主键进行排序和存储。实际上,在主键后面,SQLServer创建了一个。聚集索引的一个特点是数据总是基于它进行物理排序

如果需要按自定义顺序显示数据,则需要使用order By进行指定


@Brad当前提供了一个示例查询,该查询根据IN子句对数据进行排序:

当您有主键时,数据将根据主键进行排序和存储。实际上,在主键后面,SQLServer创建了一个。聚集索引的一个特点是数据总是基于它进行物理排序

如果需要按自定义顺序显示数据,则需要使用order By进行指定


@Brad目前提供了一个示例查询,该查询根据IN子句对数据进行排序:

如果不希望使用默认排序,则需要明确说明所需结果的顺序

SELECT *
FROM TABLE
WHERE ID IN ('100','20','222','1','15')
ORDER BY 
        CASE WHEN ID = '100' THEN 1
             WHEN ID = '20' THEN 2
             WHEN ID = '222' THEN 3
             WHEN ID = '1' THEN 4
             WHEN ID = '15' THEN 5
        END

如果不希望使用默认排序,则需要明确说明所需结果的顺序

SELECT *
FROM TABLE
WHERE ID IN ('100','20','222','1','15')
ORDER BY 
        CASE WHEN ID = '100' THEN 1
             WHEN ID = '20' THEN 2
             WHEN ID = '222' THEN 3
             WHEN ID = '1' THEN 4
             WHEN ID = '15' THEN 5
        END

还有另一种选择。XML解析器将包含一个序列号

Declare @List varchar(max) = '100,20,222,1,15'

Select A.*
 From  YourTable A
 Join (
        Select RetSeq = Row_Number() over (Order By (Select null))
              ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
        From  (Select x = Cast('<x>' + replace(@List,',','</x><x>')+'</x>' as xml).query('.')) as A 
        Cross Apply x.nodes('x') AS B(i)
      ) B  on A.ID=B.RetVal
 Order by B.RetSeq

还有另一种选择。XML解析器将包含一个序列号

Declare @List varchar(max) = '100,20,222,1,15'

Select A.*
 From  YourTable A
 Join (
        Select RetSeq = Row_Number() over (Order By (Select null))
              ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
        From  (Select x = Cast('<x>' + replace(@List,',','</x><x>')+'</x>' as xml).query('.')) as A 
        Cross Apply x.nodes('x') AS B(i)
      ) B  on A.ID=B.RetVal
 Order by B.RetSeq

SELECT不按任何特定顺序对结果排序,并且输出不保证为任何顺序。如果它是按ID排序的,那么它只是一个共关联,在没有ORDER by子句的情况下,您不应该依赖它进行排序。SELECT不会按任何特定顺序对结果排序,并且不能保证输出为任意顺序。如果它是按ID排序的,那么它只是一个共关联,在没有ORDER by子句的情况下,您不应该依赖它进行排序。数据总是根据主键进行排序和存储。不,这是默认行为。但也可能有不同的群集键或堆组织表。@ShannonSeverance感谢您的评论,我已经更新了答案并消除了歧义。数据总是根据主键排序和存储的。不,这是默认行为。但是也可以使用不同的集群键或堆组织的表。@ShannonSeverance谢谢您的评论,我已经更新了答案并消除了歧义