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

Retrieve the Return Result with Chronological Order Based on Parameter

目标:
我的请求是根据用户定义 Table 中的时间顺序列表,将 sp_Test 中的 return 结果检索为 8、2、4、1 ,3(见图 1)输入 dbo.tvf_id.

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

不知道怎么办?

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

图片二:

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

如果没有明确的 ORDER BY 语句,SQL 服务器将使用多种方式确定顺序,例如collation\indexes\order 插入等。这是任意的,会随着时间的推移而改变!

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
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