Могут ли некоторые объяснить этот код TSQL для меня? - PullRequest
1 голос
/ 15 декабря 2010

Я получил следующую хранимую процедуру, но я новичок в T-SQL и не совсем уверен в ее синтаксисе. Могут ли некоторые объяснить мне немного?

Вопрос:

  • Что означает синтаксис #tmp?
  • Где определяется c в c.RootCategoryId?

Вот код:

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

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

#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 должен быть столбцом этой временной таблицы, и, таким образом, он должен быть одной из строк, возвращаемых из хранимой функции, вызываемой выше.

0 голосов
/ 15 декабря 2010

Вам действительно нужна временная таблица?

   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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...