根据参数按时间顺序检索返回结果
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 将使用多种方式确定顺序,例如collation\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/…以上是关于根据参数按时间顺序检索返回结果的主要内容,如果未能解决你的问题,请参考以下文章