Начинающий: Использование «С» вне цикла while? - PullRequest
1 голос
/ 08 декабря 2011

У меня вопрос к новичку.

Это фрагмент кода, который работает:

declare @RowNr int = 1
declare @CA int = 0

While @RowNr <= 1000
BEGIN
    With CCWithRow AS
    (
        SELECT CA ,ROW_NUMBER() OVER (order by CA) as RowNr
        FROM myCATable
    )

    SELECT @CA = CA, @RowNr = RowNr
    FROM CCWithRow
    WHERE RowNr = @RowNr
    Set @RowNr +=  1

--Doing something with @CA here
END

Этот код не:

    declare @RowNr int = 1
    declare @CA int = 0

    With CCWithRow AS
    (
            SELECT CA ,ROW_NUMBER() OVER (order by CA) as RowNr
        FROM myCATable
    )

    While @RowNr <= 1000
    BEGIN
        SELECT @CA = CA, @RowNr = RowNr
        FROM CCWithRow
        WHERE RowNr = @RowNr
        Set @RowNr +=  1    
--Doing something with @CA here
    END

Вопрос: Почему я должен «определять» WITH внутри цикла?

Я знаю, что есть более эффективные способы решения исходной проблемы, так что это не должно быть предметом. Просто хочу знать, почему я не могу определить WITH вне цикла и использовать его внутри.

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

От BOL

Общее табличное выражение (CTE) можно рассматривать как временный набор результатов, определенный в пределах области выполнения одного оператор SELECT, INSERT, UPDATE, DELETE или CREATE VIEW.

Таким образом, общее использование табличного выражения должно всегда происходить сразу после окончания определения CTE, как оно естьнет возможности ссылаться где-либо еще.Этот случай не является исключением.

1 голос
/ 08 декабря 2011

Проверьте следующий оператор в MSDN Общие табличные выражения

Общее табличное выражение (CTE) можно рассматривать как временный набор результатов, который определен within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement.

Он не хранится как объект и длится только в течение запрос. Он сразу же освобождается после предыдущего оператора выбора в выражение CTE.

Обратитесь к разделу статьи в журнале Microsoft - Структура CTE для получения дополнительной информации о CTE.

CTE - это конструкция уровня языка, то есть SQL Server не внутренне создавать временные или виртуальные таблицы. Основной запрос CTE будет вызываться каждый раз, когда на него ссылаются в следующем запрос.

1 голос
/ 08 декабря 2011

То есть реализация CTE:

На CTE может ссылаться только утверждение, что немедленно следует CTE . Это означает, что если вы хотите использовать CTE, вы должны написать запрос, который ссылается на CTE сразу после CTE в пакет T-SQL. ( ссылка )

Результатом CTE является не созданный объект, это просто набор результатов, основанный на синтаксическом анализе выражения CTE, во многом как подзапрос (select ..), к которому вы также не можете получить доступ в другом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...