2010-12-15 35 views
1

J'ai obtenu la procédure stockée suivante, mais je suis nouveau à T-SQL et pas très sûr de sa syntaxe. Est-ce que certains pourraient m'expliquer un peu?Est-ce que certains pourraient expliquer ce code TSQL pour moi?

Question:

  • Que représente la syntaxe pour #tmp?
  • Où est défini c dans c.RootCategoryId?

Voici le code:

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 

Répondre

3

Le #tmp est une table temporaire locale, par exemple il est seulement visible à la connexion qui l'a créé, et une fois cette connexion disparue, la table temporaire l'est aussi. Alors que DROP TABLE #tmp à la fin n'est vraiment pas nécessaire - la table serait automatiquement supprimée par SQL Server.

Cette table temporaire a été créé ici:

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

il contiendra l'une des lignes que le jeu de résultats de la dbo.fnGetCategories fonction stockée sera de retour.

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

Ici, les données sont sélectionnées à partir de cette table temporaire, qui a un alias de table c - donc donc que c.RootCategoryId doit être une colonne de cette table temporaire, et il doit donc être l'une des lignes est renvoyé par la fonction stockée ci-dessus.

+0

hmm ... la table drop n'est pas si redondante. Si ce code est exécuté par un serveur qui maintient une connexion ouverte, les tables temporaires peuvent s'accumuler. – gjvdkamp

+1

@gjvdkamp - Les tables temporaires locales sont réellement supprimées lorsqu'un proc stocké se termine, si elles sont créées dans un proc stocké, plutôt que lorsque la connexion est fermée, donc il est toujours redondant. –

0

Avez-vous vraiment besoin d'une table temporaire?

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

Si vous postez du code ou du code XML, ** s'il vous plaît ** surlignez ces lignes dans l'éditeur de texte et cliquez sur le bouton "code" (101 010) dans la barre d'outils de l'éditeur pour le mettre en valeur! –

+1

Désolé je suis un "débutant" ;-) –

+0

Pas de problème - la prochaine fois que vous connaissez :-) –