2012-11-13 209 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网站.... –

相关问题