根据参数

时间:2015-06-23 08:31:40

标签: tsql stored-procedures sql-server-2012

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

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

我不知道该怎么办?

信息:
*我正在使用SQL Server 2012.
*对于每个数据库请求,UDT中的数据都是随机的 图1:
enter image description here

图2:
enter image description here

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

2 个答案:

答案 0 :(得分:1)

如果没有显式的ORDER BY语句,SQL Server将使用各种方法确定订单,例如collat​​ion \ 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