Intereting Posts
Объединить строку с количеством вхождения Как написать соединение с такими необычными критериями соответствия? Инициализация mysql-иерархии, получение всех подкатегорий извлекать данные SQL из двух таблиц MySQL, как вы обрезаете таблицу в хранимой процедуре? Копирование строк с обратной связью PK Сумма SQL с условием SSRS 2008 R2 – печать на портрете, а не на пейзаж из ссылки сервера отчетов Потребление веб-сервисов от Oracle PL / SQL Преобразование даты из одного формата в другой с помощью SQL * Файл управления загрузчиком postgresql – обновить древовидную таблицу с строками из одной таблицы, изменив id иparent_id Почему поддержка СУБД не поддерживается как обновить все таблицы с определенным именем столбца Создание динамической формы, но как выполнить запрос? показывая один столбец несколько раз с данными из трех разных интервалов времени

Использование 3 обновлений в одной и той же процедуре хранения? «Небольшая ошибка»

У меня есть следующий SP, у него есть 3 оператора обновления. Каждый I EXEC этот SP получает ошибку «Msg 208, уровень 16, состояние 1, процедура sp_Rating_Comments, строка 41 Недопустимое имя объекта« RatingLines ».». Эта ошибка находится во втором операторе обновления. Когда я скрываю второй и третий оператор обновления, мой код работает отлично. Любая идея, как я могу использовать эти 3 документа обновления вместе.

Alter PROCEDURE [HRSDB].[sp_Rating_Comments] -- @BookingNr varchar(25) -- ,@Company varchar(30) AS BEGIN SET NOCOUNT ON; ;WITH RatingLines AS -- Get the important columns from both HRSDB tables ( Select RDA.[CTS] AS [CTS] ,RDA.[B_KEY] AS [B_KEY] ,RDA.[H_KEY] AS [H_KEY] ,RDA.[RT_ID] AS [RT_ID] ,RDA.[RT_AVGRATING] AS [RT_AVGRATING] ,RDDA.[RTD_COMMENT] AS [RTD_COMMENT] From [DynNavHRS].[HRSDB].[HTL_RATING_ALL_DA] RDA Join [DynNavHRS].[HRSDB].[HTL_RATING_DETAIL_ALL_DA] RDDA ON RDA.RT_ID =RDDA.RT_ID AND RDDA.[RTD_COMMENT] <> '' AND RDA.[B_KEY]='19214642' -- Just to test with one rec ) -- First Table: UPDATE [DynNavHRS].[dbo].[HRS$Agency Header] SET [Booking Rating] = '1' FROM [DynNavHRS].[dbo].[HRS$Agency Header] AH INNER JOIN RatingLines RL1 ON RL1.[B_KEY] = AH.[Reservation No_] WHERE RL1.[RTD_COMMENT] <> '' -- If the Booking have a comment in DB2 AND [Booking Rating] = '0' ; -- in order to avoide scanning all line -- Second Table: UPDATE [DynNavHRS].[dbo].[HRS$Correction Agency Header] SET [Booking Rating] = '1' FROM [DynNavHRS].[dbo].[HRS$Correction Agency Header] CL INNER JOIN RatingLines RL2 ON RL2.[B_KEY] = CL.[Reservation No_] WHERE RL2.[RTD_COMMENT] <> '' -- If the Booking have a comment in DB2 AND [Booking Rating] = '0' ; -- in order to avoide scanning all line -- Third Table: UPDATE [DynNavHRS].[dbo].[HRS$Agency Display Line] SET [Booking Rating] = '1' FROM [DynNavHRS].[dbo].[HRS$Agency Display Line] DL INNER JOIN RatingLines RL3 ON RL3.[B_KEY] = DL.[Reservation No_] WHERE RL3.[RTD_COMMENT] <> '' -- If the Booking have a comment in DB2 AND [Booking Rating] = '0' ;-- in order to avoide scanning all line COMMIT END 

Вы запускаете SP с ;WITH RatingLines ... который соединяется с первым оператором UPDATE , а не с другими. Эта конструкция создает CTE, который видим только для первого оператора, который следует за ним. Дополнительное объяснение можно найти в TN для WITH common_table_expression (Transact-SQL) . В частности, этот отрывок из примечаний подчеркивает следующее:

За CTE должен следовать один оператор SELECT, INSERT, UPDATE, MERGE или DELETE, который ссылается на некоторые или все столбцы CTE.

Чтобы эта таблица была известна для всех операторов в вашем SP, вместо этого RatingLines вместо RatingLines табличную переменную или временную таблицу для RatingLines .

Схема с использованием временной таблицы будет выглядеть следующим образом:

 Select RDA.[CTS] AS [CTS] ,RDA.[B_KEY] AS [B_KEY] ,RDA.[H_KEY] AS [H_KEY] ,RDA.[RT_ID] AS [RT_ID] ,RDA.[RT_AVGRATING] AS [RT_AVGRATING] ,RDDA.[RTD_COMMENT] AS [RTD_COMMENT] INTO #RatingLines -- Create #RatingLines as temporary table From [DynNavHRS].[HRSDB].[HTL_RATING_ALL_DA] RDA Join [DynNavHRS].[HRSDB].[HTL_RATING_DETAIL_ALL_DA] RDDA ON RDA.RT_ID =RDDA.RT_ID AND RDDA.[RTD_COMMENT] <> '' AND RDA.[B_KEY]='19214642'; -- Throughout the rest of the SP, use #RatingLines as your ratings table; eg: ... INNER JOIN #RatingLines RL1 ... -- At the end of the SP, drop the temporary table DROP TABLE #RatingLines;