0

我有一个返回唯一 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 循环。

4

2 回答 2

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

于 2012-11-13T10:41:47.830 回答
1

将单数 INSERT INTO.. SELECT 分开:

暂时存储 SELECT 结果

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

存储行数并获得那么多数字

 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()如果你不在乎就去做。

于 2012-11-13T10:46:01.377 回答