2010-12-15 14 views
1

私は以下のストアドプロシージャを持っていますが、私はT-SQLを初めて使っていて、その構文についてはあまりよく分かりません。いくつか私に少し説明できますか?私はこのTSQLコードを説明できますか?

質問:

  • 何のために#tmp構文立つのでしょうか?
  • c.RootCategoryIのcはどこに定義されていますか?

ここではコードです:

ALTER PROCEDURE [dbo].[GetAllTopCategories] 
    @prewin7 bit 
AS 
SELECT * INTO #tmp FROM dbo.fnGetCategories(@prewin7) 

SELECT 
    c.RootCategoryId CategoryId, 
    c.CategoryName + ' [' + CAST(g.DiagnosticCount AS nvarchar(max)) + ']' CategoryName, 
    @prewin7 as PreWin7 
FROM (
    SELECT 
     c.RootCategoryId CategoryId, 
     SUM(c.DiagnosticCount) DiagnosticCount 
    FROM #tmp c 
    GROUP BY c.RootCategoryId 
) g 
INNER JOIN #tmp c ON c.CategoryId = g.CategoryId 
ORDER BY c.CategoryName 

DROP TABLE #tmp 

答えて

3

#tmpは、例えば、ローカルな一時テーブルですそれはそれを作成した接続にしか見えず、一度その接続がなくなると一時テーブルも消えてしまいます。したがって、最後にDROP TABLE #tmpが必要ではありません。テーブルはSQL Serverによって自動的に削除されます。

この一時テーブルは、ここで作成されました:

SELECT * INTO #tmp FROM dbo.fnGetCategories(@prewin7) 

ので、dbo.fnGetCategories保存された関数から結果セットが返される行のいずれかが含まれます。ここ

SELECT 
    c.RootCategoryId CategoryId, 
    SUM(c.DiagnosticCount) DiagnosticCount 
FROM #tmp c 

、データはcの表の別名を有する一時テーブルから選択され、 - c.RootCategoryIdがその一時テーブルの列でなければならず、従ってそれは行の1つでなければならないこと、従って上記のストアド・ファンクションから戻されます。

+0

hmm ...ドロップテーブルはそれほど冗長ではありません。このコードが接続を開いたままにしておくサーバによって実行されると、一時テーブルが構築されます。 – gjvdkamp

+1

@gjvdkamp - ローカルの一時テーブルは、格納されたprocが終了すると、ストアドプロシージャ内で作成された場合は、接続が閉じられているときではなく、実際には削除されます。 –

0

本当に一時テーブルが必要ですか?

ALTER PROCEDURE [dbo].[GetAllTopCategories] 
     @prewin7 bit 
    AS 

    /*SELECT * INTO #tmp FROM dbo.fnGetCategories(@prewin7)*/ 

    SELECT 
     c.RootCategoryId CategoryId, 
     c.CategoryName + ' [' + CAST(g.DiagnosticCount AS nvarchar(max)) + ']' CategoryName, 
     @prewin7 as PreWin7 
    FROM (
     SELECT 
      c.RootCategoryId CategoryId, 
      SUM(c.DiagnosticCount) DiagnosticCount 
     FROM (select * FROM dbo.fnGetCategories(@prewin7)) c 
     GROUP BY c.RootCategoryId 
    ) g 
    INNER JOIN (select * FROM dbo.fnGetCategories(@prewin7)) c ON c.CategoryId = g.CategoryId 
    ORDER BY c.CategoryName 
+0

コードやXMLを投稿する場合は、テキストエディタでこれらの行をハイライト表示し、エディタツールバーの "code"ボタン(101 010)をクリックして、フォーマットや構文を強調表示してください! –

+1

申し訳ありません私は "初心者"です;-) –

+0

いいえ問題はありません - 次回あなたが知っているのは:-) –

関連する問題