Я довольно новый для SQL Server 2012, и я пытаюсь создать хранимую процедуру, которая следует:Выполнять несколько операторов и CTE в хранимой процедуре в SQL Server 2012?
- Удалить предыдущие данные из таблицы, на основе параметра, то
- Включить новые данные о эта таблица.
Но мне нужно использовать КТР с для исполнения и по другим причинам (пожалуйста не зацикливаться на том, что я должен, просто поверьте мне на слово).
Запрос 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 в свою собственную транзакцию, которая тоже не работала, всегда получаю одну из двух ошибок.
Любые указатели будут очень благодарны, спасибо !!!
Поставьте точку с запятой перед 'WITH'. Например: '; WITH'. –
@wewesthemenace - Оба являются эквивалентными –
Ваш второй запрос выглядит хорошо. Если возможно, отправьте полный запрос –