2012-05-29 61 views
0

我想寫遞增函數返回一個更新的結果,並返回一個int的列值:在存儲過程OUTPUT DELETED條款

CREATE PROCEDURE [GetNextTagSuffix] 
AS 
BEGIN 

    UPDATE [MyTable] 
    SET [NextTagSuffix] = [NextTagSuffix] + 1 
    OUTPUT DELETED.[NextTagSuffix] 
    WHERE [MyTableId] = 'SpecialCase' 

END 

OUTPUT子句可以輸出INTO一個表變量或臨時表,但我只需要這個單一的值,所以首先添加到表變量似乎很愚蠢。有沒有辦法將這個值直接賦值給一個變量並返回它?

使用表變量解決:

CREATE PROCEDURE [GetNextTagSuffix] 
@TagSuffix int out 
AS 
BEGIN 

DECLARE @tagTable TABLE 
(
    NextTagSuffix int 
) 

UPDATE [MyTable] 
SET [NextTagSuffix] = [NextTagSuffix] + 1 
OUTPUT DELETED.[NextTagSuffix] INTO @tagTable 
WHERE [MyTableId] = 'SpecialCase' 

SET @TagSuffix = (SELECT MAX(NextTagSuffix) FROM @tagTable) 

RETURN @TagSuffix 

END 
+1

雖然我同意這似乎很奇怪,我建議使用一個表變量在一個臨時表。臨時表將使用tempdb,而如果沒有可用於操作的內存,表變量將僅使用tempdb - 因此表變量更可能更快。要麼緩解對錶的第二次讀取以獲取值...順便說一下,從SQL Server 2012開始,您可以使用序列來處理增量。 –

+0

如果你只是想返回一個值,那麼你可以在你的存儲過程中使用輸出變量 – praveen

+0

謝謝@OMGPonies--不幸的是我現在暫時停留在2005年。 –

回答

2

我相信你必須分配輸出到一個表變量或臨時表。從BOL documentation

<OUTPUT_CLAUSE> ::= 
{ 
    [ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ (column_list) ] ] 
    [ OUTPUT <dml_select_list> ] 
} 

注意它是如何指定的輸出可被選擇到一個表或變量表。

2006年提交了一個Microsoft Connect action item,要求您準確使用您希望使用的功能(能夠根據OUTPUT子句的結果對標量變量進行賦值)。微軟將該項目關閉爲「封閉不會修復」,因此確保此功能在SQL 2005中不可用,並且未放入SQL 2008.因此,除非他們改變了主意,否則它在SQL 2012中不可用。您可能希望在未來的SQL版本中對連接項目進行投票或提出請求此功能的新項目。然而

+0

+1:研究成果! –

+0

謝謝Joe,我確實讀過了doco並記下了OUTPUT子句的選項。我希望可能有替代使用表變種。 –

0

ü可以使用輸出參數在SP

CREATE PROCEDURE [GetNextTagSuffix] 
@value int output 
AS 
BEGIN 

UPDATE [MyTable] 
SET [NextTagSuffix] = [NextTagSuffix] + 1 
OUTPUT DELETED.[NextTagSuffix] 
WHERE [MyTableId] = 'SpecialCase' 

END 


DECLARE @result int 
EXEC GetNextTagSuffix @[email protected] output