2016-12-21 101 views
-1

我有一個複雜的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子句相同的順序很重要,因爲它是通過()

+1

有什麼顧慮?是什麼導致了這些擔憂? – iamdave

+0

1.表變量的大小。我不需要在輸出後存儲data_columns – svolkov

+2

沒有足夠的信息供任何人幫助您。 「表格大小」是什麼意思? –

回答

0

它看起來像你對我試圖堅持一個特定的排序順序在這種情況下,你可以使用ROW_NUMBER產生期望的效果:

SELECT ROW_NUMBER() OVER(ORDER BY OriginalSortingColumns) AS SortOrder     
     , data_columns 
    FROM sourcetable 

但不知道更多關於你的程序的目的和有關數據的結構和性質,我不能肯定。閱讀本指南非常值得 - How do I ask a good question? - 確保您提供我們所需的所有信息,以便快速爲您提供最佳答案。

正如評論所說,你永遠不能依賴鍵來訂購數據,這就是ORDER BY聲明的目的。

+0

謝謝你的回覆。我在問一個技術問題。我相信在SELECT語句中提供細節而不是三個點會給我部分答案。我在我的問題上又增加了一項 – svolkov