根据参数按时间顺序检索 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
目标:
我的请求是根据用户定义 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