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

編集:正直なところ、本当に必要なものを理解したかどうかはよくわかりません。自分でIDを作成しているようです(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 に答える