SQL Server с областью действия - PullRequest
0 голосов
/ 10 июня 2011

Мне было интересно, есть ли какой-нибудь способ сделать область действия с оператором больше, чем просто для первого оператора после с, например

WITH cr AS (SELECT TOP 1 * FROM @rq ORDER BY h, f)
SELECT * FROM cr
DELETE cr FROM @rq

к моменту достижения строки DELETE cr FROM @rq SQL SERVER больше не запоминает, что такое cr и выдает ошибку Invalid object name 'cr'., я попытался добавить блоки начала и конца, чтобы это выглядело как

WITH cr AS (SELECT TOP 1 * FROM @rq ORDER BY h, f)
BEGIN
    SELECT * FROM cr
    DELETE cr FROM @rq
END

но это неверно и выдает ошибку Incorrect syntax near the keyword 'BEGIN'.

Можно ли расширить область действия оператора with или он всегда был создан для немедленного использования, а затем уже недоступен?

Примечание:

WITH cr AS (SELECT TOP 1 * FROM @rq ORDER BY h, f)
DELETE cr FROM @rq

работает как

WITH cr AS (SELECT TOP 1 * FROM @rq ORDER BY h, f)
SELECT * FROM cr

поэтому оба оператора допустимы, если используется оператор with

Ответы [ 2 ]

1 голос
/ 10 июня 2011

На данный момент вам необходимо сохранить результаты запроса CTE в табличной переменной или временной таблице. открытый элемент Microsoft Connect запрашивает такую ​​функциональность, если вы хотите проголосовать за него.

0 голосов
/ 10 июня 2011

В вашем конкретном случае вы можете объединить delete + select в одно выражение, которое вы можете использовать с вашим CTE, указав OUTPUT;

DECLARE @rq TABLE (h INT, f INT) INSERT @rq VALUES (5,0),(6,0),(7,0)

;WITH cr AS (SELECT TOP 1 * FROM @rq ORDER BY h, f)
DELETE cr
   OUTPUT DELETED.*
FROM @rq    

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