16
CREATE PROCEDURE [test].[proc]
@ConfiguredContentId int,
@NumberOfGames int
AS
BEGIN
 SET NOCOUNT ON
 RETURN 
 @WunNumbers TABLE (WinNumb int)

    INSERT INTO @WunNumbers (WinNumb)
 SELECT TOP (@NumberOfGames) WinningNumber
 FROM [Game].[Game] g
 JOIN [Game].[RouletteResult] AS rr ON g.[Id] = rr.[gameId]
 WHERE g.[ConfiguredContentId] = @ConfiguredContentId
 ORDER BY g.[Stoptime] DESC

 SELECT WinNumb, COUNT (WinNumb) AS "Count"
 FROM @WunNumbers wn
 GROUP BY wn.[WinNumb]
END
GO

このストアドプロシージャは最初のselectステートメントから値を返しますが、2番目のselectステートメントからの値を返したいのですが。テーブル@WunNumbersは一時的なテーブルです。

何か案は???

4

6 に答える 6

31

このコードを見てください、

CREATE PROCEDURE Test

AS
    DECLARE @tab table (no int, name varchar(30))

    insert @tab  select eno,ename from emp  

    select * from @tab
RETURN
于 2009-09-18T10:50:56.323 に答える
6

使用しているSQLServerのバージョンは何ですか?SQL Server 2008では、テーブルパラメータとテーブルタイプを使用できます。

別のアプローチは、ユーザー定義関数からテーブル変数を返すことですが、私はこのメソッドの大ファンではありません。

ここに例があります

于 2009-09-18T10:29:57.940 に答える
4

一時テーブルを呼び出し元で作成し、呼び出されたSPから入力できます。

  create table #GetValuesOutputTable(
     ...   
  );

  exec GetValues; -- populates #GetValuesOutputTable

  select * from #GetValuesOutputTable;

「insertexec」に対するこのアプローチのいくつかの利点は、ネストできることと、入力または出力として使用できることです。

いくつかの欠点は、「引数」が公開されていないこと、テーブルの作成が各呼び出し元内に存在すること、およびテーブルの名前が他の一時オブジェクトと衝突する可能性があることです。これは、一時テーブル名がSP名と厳密に一致し、何らかの規則に従っている場合に役立ちます。

もう少し詳しく説明すると、出力専用の一時テーブルの場合、insert-execアプローチと一時テーブルアプローチは、呼び出されたSPによって同時にサポートできます。これは、SPをチェーンするのにあまり役立ちません。これは、テーブルを呼び出し元で定義する必要があるためですが、cmd行からのテストや外部からの呼び出しを簡素化するのに役立ちます。

  -- The "called" SP
  declare
      @returnAsSelect bit = 0;

  if object_id('tempdb..#GetValuesOutputTable') is null
  begin
      set @returnAsSelect = 1;
      create table #GetValuesOutputTable(
         ...   
      );
  end

  -- populate the table

  if @returnAsSelect = 1
      select * from #GetValuesOutputTable;
于 2012-07-03T17:50:26.633 に答える
1

はい、できます。

ストアドプロシージャでは、テーブルに入力します@tbRetour

ストアドプロシージャの最後に、次のように記述します。

SELECT * FROM @tbRetour 

ストアドプロシージャを実行するには、次のように記述します。

USE [...]
GO

DECLARE @return_value int

EXEC @return_value = [dbo].[getEnregistrementWithDetails]
@id_enregistrement_entete = '(guid)'

GO
于 2014-12-05T20:25:18.700 に答える
0

プロシージャの戻りタイプはintです。

(コードが現在行っているように)結果セットを返すこともできます(わかりました、文字列であるメッセージを送信することもできます)

これらはあなたが作ることができる唯一の「リターン」です。テーブル値パラメーターをプロシージャーに追加できますが(BOLを参照)、それらは入力のみです。

編集:

(または、別のポスターで述べたように、プロシージャではなく、テーブル値関数を使用することもできます)

于 2009-09-18T11:09:47.620 に答える
0

最初に、返された一時テーブルに必要なレイアウトを持つ実際の永続テーブルをテンプレートとして作成します。これは、テンプレートとして識別し、それをSPにシンボリックにリンクする命名規則(tmp_SPName_Outputなど)を使用します。このテーブルにデータが含まれることはありません。

SPで、INSERTを使用して、同じ命名規則(たとえば、存在すると想定される#SPName_Output )に従って一時テーブルにデータをロードします。その存在をテストし、存在しない場合はエラーを返すことができます。

spを呼び出す前に、次の単純な選択を使用して一時テーブルを作成します。

SELECT TOP(0) * INTO #SPName_Output FROM tmp_SPName_Output;
EXEC SPName;
-- Now process records in #SPName_Output;

これには、次の明確な利点があります。

  • 一時テーブルは##とは異なり、現在のセッションに対してローカルであるため、異なるセッションからのSPへの同時呼び出しと衝突することはありません。スコープ外の場合も自動的に削除されます。
  • テンプレートテーブルはSPと一緒に維持されるため、出力に変更が加えられた場合(たとえば、新しい列が追加された場合)、SPの既存の呼び出し元は中断されません。発信者を変更する必要はありません。
  • 1つのSPに異なる名前の出力テーブルをいくつでも定義して、それらすべてに入力することができます。また、異なる名前の代替出力を定義し、SPに一時テーブルの存在をチェックさせて、どちらを入力する必要があるかを確認することもできます。
  • 同様に、大きな変更が加えられたが下位互換性を維持したい場合は、新しいテンプレートテーブルを作成し、新しいバージョンの名前を付けることができますが、呼び出し元が作成した一時テーブルを確認することで、以前のバージョンをサポートできます。
于 2017-07-21T16:09:16.660 に答える