T-SQL表变量数据顺序

时间:2011-07-20 18:31:18

标签: tsql

我有一个返回表变量的UDF,如

--
--
RETURNS @ElementTable TABLE
(
    ElementID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
    ElementValue VARCHAR(MAX)
)
AS
--
--

此表变量中的数据顺序是否保证与插入订单数据的顺序相同。例如如果我发出

INSERT INTO @ElementTable(ElementValue) VALUES ('1')
INSERT INTO @ElementTable(ElementValue) VALUES ('2')
INSERT INTO @ElementTable(ElementValue) VALUES ('3')

我希望当我说

时,数据将始终以该顺序返回
select ElementValue from @ElementTable  --Here I don't use order by 

修改

如果无法保证order by,则以下查询

SELECT T1.ElementValue,T2.ElementValue FROM dbo.MyFunc() T1
Cross Apply dbo.MyFunc T2
order by t1.elementid

不会产生9x9矩阵

1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3

一致。

是否有可能像

1 2
1 1
1 3
2 3
2 2
2 1
3 1
3 2
3 3

如何使用我的上述功能?

4 个答案:

答案 0 :(得分:4)

不,订单不保证是相同的。

除非您使用ORDER BY。然后它保证是相同的。

答案 1 :(得分:2)

鉴于您的更新,您以明显的方式获得它 - 您要求系统按您想要的顺序提供结果:

SELECT T1.ElementValue,T2.ElementValue FROM dbo.MyFunc() T1
Cross join dbo.MyFunc() T2
order by t1.elementid, t2.elementid

保证,如果您在UDF中使用效率低下的单行插入,则IDENTITY值将与指定各个INSERT语句的顺序相匹配。

答案 2 :(得分:0)

订单无法保证。

但是,如果您想要的只是简单地按照您插入的相同顺序取回记录,那么只需按主键排序即可。由于您已将该字段设置为自动增量,因此它就足够了。

答案 3 :(得分:0)

...或使用确定性函数

SELECT TOP 9 
  M1 = (ROW_NUMBER() OVER(ORDER BY id) + 2) / 3,
  M2 = (ROW_NUMBER() OVER(ORDER BY id) + 2) % 3 + 1
FROM 
  sysobjects

M1  M2
1   1
1   2
1   3
2   1
2   2
2   3
3   1
3   2
3   3