2013-06-27 8 views
5

Я получаю синтаксическую ошибку при попытке создать хранимую процедуру, хотя точно такой же код отлично работает как запрос. Я сам не вижу ошибку, поэтому любая помощь будет оценена по достоинству.Синтаксическая ошибка SQL Server для хранимой процедуры

Ошибка:

Msg 102, Level 15, State 1, процедура DataSelect, линия 12 Неправильный синтаксис около 'OrderedYTD'.

И код просто:

CREATE PROCEDURE DataSelect 
(
@TargetPdc int 
) 
AS 
BEGIN 

    -- Refresh Data Here 
    EXEC DataUpdate 

    -- Select Data for Report 
    WITH OrderedYTD AS 
    (
     SELECT custextract.*, histextract.*, 
     ROW_NUMBER() OVER (PARTITION BY custextract.custcustno ORDER BY histextract.salesytd desc) AS RowNumber 
     FROM custextract 
     INNER JOIN histextract 
      ON custextract.custcustno = histextract.histcustno 
     WHERE (custextract.ecall = 'Y') 
    ) 

SELECT OrderedYTD.* 
FROM OrderedYTD 
WHERE RowNumber <= 10 and pdc = @TargetPdc; 

END 

Я запускать все, начиная с оператором С (минус переменной в ИНЕКЕ) как запрос несколько раз без каких-либо проблем. Существует ли синтаксическая разница с использованием CTE внутри хранимой процедуры? Благодарю.

ответ

4

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

EXEC DataUpdate; 

Если вы не прекратить все заявления с запятой, стандартная практика, чтобы поместить их до вашего CTE определения:

;WITH OrderdYTD AS 
+1

Вы должны объяснить это в other way round: Завершить предыдущий оператор с помощью ';' вместо «добавления» '' 'в CTE. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/09/03/ladies-and-gentlemen-start-your-semi-colons.aspx –

+0

Вот и все! Спасибо за урок. Я должен начать улучшаться с прекращением моих заявлений. –

+0

@a_horse_with_no_name Не говорите Аарону, я никогда не услышу его конца: P – JNK