2

次のように使用して、見つかったインデックスを使用して一時テーブルを作成するストアドプロシージャがありますCONTAINSTABLE(ストアドプロシージャコードの一部を配置します)。

CREATE TABLE #tmpTable(
  ID INT,
  RANK INT)

 SELECT @query = ' 
  SELECT 
    DISTINCT ID AS T_ID,
   indexTable.RANK AS RANK
  FROM 
   MyTable
  INNER JOIN
   CONTAINSTABLE(MyTable, (*), "ISABOUT('example*')") AS indexTable
  ON
   MyTable.ID = indexTable.[KEY]
  ORDER BY RANK DESC'

可能であれば、一時テーブルを別のストアドプロシージャに使用して、その値を他の目的に使用し、同じことを2回行わないようにします。

不可能な場合は、別のストアドプロシージャでテーブルデータを再利用するための最良の方法を教えてください。また、ストアドプロシージャ内にビューを作成できないことを知っているので、ビューは議論の余地がありません。

4

3 に答える 3

4

グローバル一時テーブルを使用する

CREATE TABLE ##tmpTable(
  ID INT,
  RANK INT)

テーブル名の前に二重ハッシュ (##) を付けることで、グローバル一時テーブルを作成できます。

このテーブルが接続によって作成されると、永続テーブルのように、任意の接続で任意のユーザーが使用できるようになります。すべての接続が閉じられた後にのみ削除できます。

編集:

一時テーブルの存在を確認するには、次のステートメント/チェックを使用できます。

if object_id('tempdb..##tmpTable') is not null
begin
    drop table ##tmpTable
end
于 2012-09-07T06:35:59.270 に答える
2

最初のストアド プロシージャが 2 番目のストアド プロシージャを呼び出す場合、2 番目のプロシージャは、最初のストアド プロシージャが作成した一時テーブルにアクセスできます。

create procedure SP_1
as
    create table #T1 (ID int not null)
    insert into #T1 (ID) values (1),(2)

    exec SP_2
go
create procedure SP_2
as
    select * from #T1
go
exec SP_1

2 つの行を生成します。ただし、それがあなたがやろうとしていることかどうかはわかりません.あなたの例は一時テーブルを定義するだけで、それにアクセスすることはありません.

于 2012-09-07T06:42:58.750 に答える
0

一時テーブルには、a) 一時テーブルと b) グローバル一時テーブルの 2 種類があります。

グローバル一時テーブル ( ##likeで宣言##globalTempTable) は、すべてのプロシージャで使用できます。

通常の一時テーブル ( #likeで宣言#temptale) は、ネストされたプロシージャで使用できます。sp_Asprocが別の sproc を呼び出す場合、sp_Bで宣言された一時テーブルもsp_A使用できますsp_B

于 2012-09-07T09:20:20.690 に答える