【发布时间】:2016-12-21 12:07:12
【问题描述】:
我有一个复杂的选择语句,我想返回到应用层。同时我想重用这个语句中的 id。我来到了这样的表变量解决方案
DECLARE @Result TABLE (SortOrder int IDENTITY, Id bigint, data_columns, PRIMARY KEY (Id))
INSERT INTO @Result
SELECT Id, data_columns ...
--output to the app layer
SELECT Id, data_columns FROM @Result ORDER BY SortOrder;
--using @Result Id elsewhere
SortOrder 用于保持第一次选择的原始顺序。没有它,我在 ms sql server 2012 中遇到了一个奇怪的错误。 PRIMARY KEY (Id) 用作提示优化器 Id 值是唯一的。 SortOrder 与 Id 不相关。
现在我担心内存和 CPU 过载。谁有更好的解决方案?
----- 补充: 这可以是一个答案
DECLARE @Ids TABLE (Id bigint, PRIMARY KEY (Id));
MERGE @Ids AS ids
USING (SELECT TOP 9223372036854775807 Id, data_columns ...) AS result
ON 1=0
WHEN NOT MATCHED THEN
INSERT VALUES(result.Id)
OUTPUT result.*; --output to the app layer here
--using @Ids Id elsewhere
我可以确认它适用于我的样品并且需要更少的时间。 但我仍然担心 OUTPUT 中的顺序。
TOP hack 解释MERGE INTO insertion order
MSDN 也说
无法保证应用更改的顺序 到表和插入行的顺序 输出表或表变量会对应。
幸运的是,我不关心@Ids 表中的顺序。但重要的是要在 OUTPUT 子句中获得与 USING () 中相同的顺序
【问题讨论】:
-
有什么顾虑?是什么导致了这些担忧?
-
1.表变量的大小。我不需要在输出后存储 data_columns
-
没有足够的信息可供任何人帮助您。您所说的“表格大小”是什么意思?
-
你还遇到了什么奇怪的错误?我很确定这是否只是您获取数据的顺序,这根本不是错误。
标签: sql sql-server