2012-11-13 168 views
0

我有一個存儲過程返回一個唯一的ID。我需要調用這個sp來獲得每行的唯一ID。我必須使用這個SP,因爲應用程序也使用這個。如何在select語句中爲每行執行存儲過程?

如何爲每行選擇從SP返回的ID?

CREATE procedure [dbo].[SelectNextNumber] 

@TableName nvarchar(255) 
as 
begin 

    declare @NewSeqVal int 

    set NOCOUNT ON 

    update Number --This is a table that holds for each table the max ID 

    set @NewSeqVal = Next = Next + Increase 

    where TableNaam= @TableName 

    if @@rowcount = 0 
    begin 
     Insert into Number VALUES (@TableName, 1, 1) 
     return 1 
    end 

    return @NewSeqVal 

數表:

CREATE TABLE [dbo].[Number](
    [TableName] [varchar](25) NOT NULL, 
    [Next] [int] NULL, 
    [Increase] [int] NULL 

我已經看到,雖然環是本可用,但在我的情況,我不知道如何使用while循環。

+0

儘量避免循環,如果你可以幫助它;基於集合的操作通常更快。我建議查看'Row_Number()'或排名函數來生成序列號 - 但是我不確定你想要在這裏實現什麼;聽起來像你想重新發明身份專欄。 – Bridge

回答

1

以奇異INSERT INTO ..選擇開:

臨時存儲SELECT結果遠

declare @rc int, @NewSeqVal int; 
SELECT .. 
    INTO #tmp -- add this 
    FROM .. 

Store中的行數,並得到許多數字

set @rc = @@rowcount; 

您已在SP直接使用代碼:

update Number --This is a table that holds for each table the max ID 
set @NewSeqVal = Next = Next + @rc 
where TableNaam= 'sometbl'; 

最後,插入

INSERT ... 
SELECT ID = @NewSeqVal + 1 - row_number() over (ORDER BY col1) 
     , {all the other columns} 
FROM #tmp; 

ORDER by Col1是任意的,選擇一些明智的,或使其ORDER BY NEWID()如果你不」不在乎。

3

您不能在SELECT語句內使用存儲過程,只能使用函數。 可以遍歷與光標一個結果,如果你真的要使用存儲過程:

http://msdn.microsoft.com/library/ms180169.aspx

編輯: 說實話,我不是很肯定已經明白你真正需要的,它看起來你正在自己建立一個IDENTITY(http://msdn.microsoft.com/library/ms174639(v=sql.105).aspx); 的是,如果你真的需要運行一個光標這裏是它使用存儲過程爲例:

http://sqlfiddle.com/#!3/2b81a/1

+0

我試過但我不知道如何..你有我的情況的例子嗎? – Ahmet

+1

@Ahmet:有很多關於SQL Server的** EVERYTHING **上的[**精彩,免費提供的**文檔](http://msdn.microsoft.com/en-us/library/ms180169.aspx) MSDN網站.... –

相關問題