我有一个返回唯一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循环。
答案 0 :(得分:3)
您不能在SELECT语句中使用存储过程,只能使用函数。 如果确实需要使用存储过程,则可以使用游标迭代结果集:
http://msdn.microsoft.com/library/ms180169.aspx
编辑: 说实话,我不太清楚你真正需要什么,看起来你正在自己建立一个身份(http://msdn.microsoft.com/library/ms174639(v=sql.105).aspx); 仍然,如果你真的需要在这里运行游标,那么这是一个使用你的存储过程的例子:
答案 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}}。