我有一個複雜的select語句,我想返回到應用程序層。同時,我想重複使用這個語句中的id。我已經來到這個表變量解決方案像這樣在1條SELECT語句中獲取結果和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黑客解釋MERGE INTO insertion order
MSDN還說
沒有保證的順序更改應用 在該行插入 表和順序輸出表或表變量將對應。
幸運的是,我不在乎@Ids表中的訂單。但是,要在OUTPUT子句相同的順序很重要,因爲它是通過()
有什麼顧慮?是什麼導致了這些擔憂? – iamdave
1.表變量的大小。我不需要在輸出後存儲data_columns – svolkov
沒有足夠的信息供任何人幫助您。 「表格大小」是什麼意思? –