我有一个返回表变量的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
如何使用我的上述功能?
答案 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