根据参数按时间顺序检索返回结果

Posted

技术标签:

【中文标题】根据参数按时间顺序检索返回结果【英文标题】:Retrieve the Return Result with Chronological Order Based on Parameter 【发布时间】:2015-06-23 08:31:40 【问题描述】:

目标: 我的要求是根据用户定义表类型 dbo.tvf_id 的时间顺序列表从 sp_Test 检索返回结果为 8、2、4、1、3(看图 1)。

问题: 当我执行存储过程时我 sp_Test 我检索从 1 到 8 的列表。

我不知道该怎么做?

信息: *我使用的是 SQL Server 2012。 *UDT 中的数据对于每个数据库请求都是随机的。 图一:

图2:

create table datatable (id int,
                        name varchar(100),
                        email varchar(10),
                        phone varchar(10),
                        cellphone varchar(10),
                        none varchar(10)                        
                       );

insert into datatable values
  (1, 'productname', 'A', 'A', 'A', 'A'), 
  (2, 'cost', '20', 'A', 'A', 'A'),
  (3, 'active', 'Y', 'A', 'A', 'A');

insert into datatable values
  (4, 'productname', 'A', 'A', 'A', 'A'), 
  (5, 'cost', '20', 'A', 'A', 'A'),
  (6, 'active', 'Y', 'A', 'A', 'A');


insert into datatable values
  (7, 'productname', 'A', 'A', 'A', 'A'), 
  (8, 'cost', '20', 'A', 'A', 'A'),
  (9, 'active', 'Y', 'A', 'A', 'A');



CREATE TYPE [tvf_id] AS TABLE
(
    [id] [int] NULL
)
GO



CREATE PROCEDURE [sp_Test]
    @pID tvf_id READONLY
as
begin
    set nocount on
    SELECT a.*
    FROM datatable a inner join @pID b on a.id = b.id
end

GO

--------------------------------------------------------

DECLARE @data tvf_id INSERT INTO @data([id]) 
VALUES (8), (2), (4), (1), (3);

exec sp_Test @pID = @data

【问题讨论】:

在 tvf_id 中添加订单列 【参考方案1】:

如果没有明确的 ORDER BY 语句,SQL Server 将使用多种方式确定顺序,例如collat​​ion\indexes\order of insert 等。这是任意的,会随着时间而改变!

No Seatbelt - Expecting Order without ORDER BY

如果你想保证你的输出的顺序,你需要让它有序!例如(按插入排序):

CREATE TYPE [tvf_id] AS TABLE
(
    [pk_id] [int] NOT NULL IDENTITY(1,1),
    [id] [int] NULL
)
GO

CREATE PROCEDURE [sp_Test]
    @pID tvf_id READONLY
as
begin
    set nocount on

    SELECT a.*
    FROM datatable a 
    INNER JOIN @pID b on a.id = b.id
    ORDER BY b.pk_id
end

【讨论】:

它将基于“UDT中的数据对于每个数据库请求都是随机的”这句话起作用? 我不明白“[pk_id]”中会添加什么值? [pk_id] 是一个整数列,从 1 自动递增 1。即要插入的第一个值是 1,第二个 2 是第三个 3. 等等。它给你一个越来越多的数字遵循您插入的数字的顺序。当您从表格中选择它们时,这将保证顺序。你不需要对它做任何事情。当您将值插入类型时,它将自动填充。命名不是很好。随意更改!【参考方案2】:
CREATE PROCEDURE [sp_Test]  @pID tvf_id READONLY 
as
begin
    set nocount on
    ;with pIDList AS
    (
        Select id, RW= ROW_NUMBER() OVER( order by (Select NULL)) from @pID

    )
    SELECT 
        a.*
    FROM datatable a  inner join pIDList b on a.id = b.id
    order by RW

end

【讨论】:

有趣的是,虽然这可行,但它可能不是万无一失的。请参阅此堆栈帖子:***.com/questions/18961789/…

以上是关于根据参数按时间顺序检索返回结果的主要内容,如果未能解决你的问题,请参考以下文章

String 的compare比较方法返回值有啥含义

如何按顺序执行承诺并返回所有结果[重复]

如何根据特定顺序对休眠结果进行排序

通过节点的异步/等待不需要按预期顺序返回结果 - 使用啥正确模式?

SPARQL 查询根据语句的顺序返回不同的结果

XPath 查询未使用 VTDNav/AutoPilot 按文档顺序将结果作为节点序列返回