目标:
我的请求是根据用户定义表类型dbo.tvf_id中的时间顺序列表,将sp_Test的返回结果检索为8,2,4,1,3(参见图1)。
问题:
当我执行存储过程时,我sp_Test I检索从1到8的列表。
我不知道该怎么办?
信息:
*我正在使用SQL Server 2012.
*对于每个数据库请求,UDT中的数据都是随机的
图1:
图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
答案 0 :(得分:1)
如果没有显式的ORDER BY语句,SQL Server将使用各种方法确定订单,例如collation \ indices \ insert等顺序。这是随意的,会随着时间而改变!
No Seatbelt - Expecting Order without ORDER BY
如果您想保证输出的顺序,您需要订购!例如(按插入顺序):
EntityKey
答案 1 :(得分:0)
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