如何在select语句中为每一行执行存储过程?

时间:2012-11-13 10:38:28

标签: sql sql-server stored-procedures

我有一个返回唯一ID的存储过程。我需要调用此sp来获取每行的唯一ID。我必须使用此SP,因为应用程序也使用此。

如何为每行选择从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循环可用于此但在我的情况下我不知道如何使用while循环。

2 个答案:

答案 0 :(得分:3)

您不能在SELECT语句中使用存储过程,只能使用函数。 如果确实需要使用存储过程,则可以使用游标迭代结果集:

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

编辑: 说实话,我不太清楚你真正需要什么,看起来你正在自己建立一个身份(http://msdn.microsoft.com/library/ms174639(v=sql.105).aspx); 仍然,如果你真的需要在这里运行游标,那么这是一个使用你的存储过程的例子:

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

答案 1 :(得分:1)

将单数INSERT INTO .. SELECT分开:

暂时存储SELECT结果

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

存储rowcount并获取那么多数字

 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是任意的,选择合情合理的东西,或者如果你不在乎的话{.1}}。