0

Я довольно новый для SQL Server 2012, и я пытаюсь создать хранимую процедуру, которая следует:Выполнять несколько операторов и CTE в хранимой процедуре в SQL Server 2012?

  1. Удалить предыдущие данные из таблицы, на основе параметра, то
  2. Включить новые данные о эта таблица.

Но мне нужно использовать КТР с для исполнения и по другим причинам (пожалуйста не зацикливаться на том, что я должен, просто поверьте мне на слово).

Запрос CTE отлично работает, если он сам по себе хранится в процедуре, но я не могу заставить SP работать с двумя предложениями.

У меня возникла ошибка при попытке создать процедуру, жалуясь, что я должен использовать точку с запятой перед CTE. Если я добавляю точку с запятой, SQL Server тоже жалуется на нее. Это сводит меня с ума, , пожалуйста, помогите!

Таблица, где я хочу удалить/вставить:

CREATE MYTABLE (APPUSER NVARCHAR(15), DATA NVARCHAR(100)) 

Упрощенная хранимая процедура (без запятой):

CREATE PROCEDURE P1 (@SOMEUSER NVARCHAR(15), @TYPE INTEGER) AS 
BEGIN 
    DELETE FROM MYTABLE WHERE ([email protected]) 

    WITH CTE AS (
     SELECT DATA 
     FROM SOURCETABLE 
     WHERE (TYPE = @TYPE) 
    ) 
    INSERT INTO MYTABLE 
    SELECT 
     @SOMEUSER, 
     DATA 
    FROM CTE 
END 

Сообщение об ошибке без запятой:

[Код ошибки: 319, SQL Состояние: S1000] Неправильный синтаксис рядом с ключевым словом 'with'. Если этот оператор является обычным табличным выражением, предложением xmlnamespaces или предложением изменения контекста изменения отслеживания, предыдущий оператор должен быть завершен точкой с запятой.

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

хранимая процедура с запятой (тот же запрос, как указано выше, показывая только точку с запятой для краткости):

(...) 
BEGIN 
    DELETE FROM MYTABLE WHERE ([email protected]); /* Semicolon */ 

    WITH CTE AS ( 
(...) 

Ошибка с запятой:

[Код ошибки: 102, Состояние SQL: 42000] Неверный синтаксис рядом с ')'.

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

Любые указатели будут очень благодарны, спасибо !!!

+1

Поставьте точку с запятой перед 'WITH'. Например: '; WITH'. –

+0

@wewesthemenace - Оба являются эквивалентными –

+3

Ваш второй запрос выглядит хорошо. Если возможно, отправьте полный запрос –

ответ

3

У вас есть что-то странное происходит потому, что следующие работы для меня:

CREATE PROCEDURE P1 (@SOMEUSER NVARCHAR(15), @TYPE INTEGER) AS 
BEGIN 
    DELETE FROM [Table_1] WHERE ([lname][email protected]); 

    WITH CTE AS (
     SELECT [fname], [lname] 
     FROM [Table_1] 
     WHERE ([ID] = @TYPE) 
    ) 
    INSERT INTO [Table_1] 
    SELECT top 1 
     @SOMEUSER, 
     [lname], 
     @TYPE 
    FROM CTE 
END 

Проверьте среду

КТР только синтаксис - это не поможет производительность

+0

CTE помогает при использовании при работе с ним направляет сервер для использования определенных индексов или когда вы можете уменьшить область запроса :) Я никогда не обнаружил, что не так, поэтому я закончил удаление за пределами SP как отдельный шаг, но я выбрал ваш ответ, потому что во время чтения я согласен с тем, что он должен работать. Должна быть проблема с интерфейсом или самим сервером. Ура! –

5

Вам нужно поставить ';' до того «С» ключевого словом, ваш код выглядеть следующим образом

CREATE PROCEDURE P1 (@SOMEUSER NVARCHAR(15), @TYPE INTEGER) AS 
BEGIN 
    DELETE FROM MYTABLE WHERE ([email protected]) 

    ;WITH CTE AS (
     SELECT DATA 
     FROM SOURCETABLE 
     WHERE (TYPE = @TYPE) 
    ) 
    INSERT INTO MYTABLE 
    SELECT 
     @SOMEUSER, 
     DATA 
    FROM CTE 
END 

Как эмпирическое правило для КТРА, всегда начинается точкой с запятой, если у вас есть какой-либо исполняемый оператор над вашим КТРОМ.

+4

Как правило, вы должны ** завершать ** каждое утверждение точкой с запятой: http://sqlblog.com/blogs/aaron_bertrand/archive/2009/09/03/ladies-and-gentlemen-start-your-semi -colons.aspx –

0

Для полной ясности точки, поднятые другими, эта выдержка the MSDN documentation on CTE's in SQL Server является существенной нотой для использования СТЭ:

• Когда CTE используется в заявлении, являющемся частью пакета, перед оператором должно следовать точка с запятой.

Как уже отмечалось, это лучшая практика либо:

  • Развивайте привычку прекращения всех SQL заявления с точкой с запятой; или
  • Изучите и запомните все необходимые точки с запятой, такие как здесь, и предисловие всех этих конструкций с одним.

Я предпочитаю первое, но я видел компетентных разработчиков, которые предпочитают второй.

Смежные вопросы