Неверный объект, использующий общее табличное выражение WITH

1

Я пытаюсь использовать С в хранимой процедуре

    USE [BusOprtn]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER  PROCEDURE [dbo].[AddRepairedStock]

     @RepairedItems [dbo].[RepairedItems] readonly


    AS
    BEGIN 

    declare @productNo bigint,@productManufacturer bigint

      SET NOCOUNT ON;

      begin try
      begin transaction
      UPDATE [BusOprtn].[dbo].[RepairItem] SET [ReturnedQuantity] = rdi.ReturnedQuantity,[AmountPaid] = rdi.AmountPaid,[ReturnDate] = rdi.ReturnDate from [BusOprtn].[dbo].[RepairItem] as ri inner join @RepairedItems as rdi on ri.id=rdi.id;

     ;with y as (
     select [PartUsedId],rdi.[ReturnedQuantity] from [BusOprtn].[dbo].[RepairItem] as ri inner join @RepairedItems as rdi on ri.Id=rdi.id 
     ), x as (
     SELECT  [PartNo] ,[ManufacturerId],[ReturnedQuantity] FROM [BusOprtn].[dbo].[PartUsed] as p inner join y 
     on p.id = y.PartUsedId
     )


      UPDATE [BusOprtn].[dbo].[ProductMaster] SET   [RepairedStock] =( [RepairedStock]+x.[ReturnedQuantity]) from [BusOprtn].[dbo].[ProductMaster] as pm inner join x on x.[PartNo]=pm.Id;
      UPDATE [BusOprtn].[dbo].[ProductStockManufacturer] SET  [RepairedCurrentStock] = ([RepairedCurrentStock]+x.[ReturnedQuantity]) from [BusOprtn].[dbo].[ProductStockManufacturer] as pm inner join x on x.[PartNo]=pm.[ProductNo] and x.[ManufacturerId]= pm.[ManufacturerId];

      commit transaction
        end try
        BEGIN CATCH
        declare @ErrorMessage nvarchar(max), @ErrorSeverity 

int, @ErrorState int;
    select @ErrorMessage = ERROR_MESSAGE() + ' Line ' + cast

(ERROR_LINE() as nvarchar(5)), @ErrorSeverity = ERROR_SEVERITY(), 

@ErrorState = ERROR_STATE();
    rollback transaction;
    raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState);
        END CATCH
END

Когда я выполняю команду выше, она выполняется успешно. Но когда я пытаюсь вызвать хранимую процедуру во время выполнения, она дает ошибку

'Invalid object name 'x'.

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1.'

Раньше проблема заключалась в подзапросе, поскольку он не разрешен с помощью "С", поэтому попытался использовать другую временную таблицу y но ошибка продолжалась. Я реферировал Разрешенные элементы для разрешенных элементов в WITH.

Теги:
stored-procedures
try-catch

2 ответа

2
Лучший ответ

Ошибка возникает из второго оператора обновления, в котором вы используете CTE x

Область для CTE - это один оператор, поэтому x отображается только для первого обновления.

Чтобы исправить это, вы можете либо дублировать код для CTE перед вторым обновлением, либо использовать временную таблицу (или переменную таблицы) для захвата вывода из x и использовать таблицу temp в обоих операциях обновления вместо CTE.

С другим форматированием кода это легко увидеть.

Первое выражение о обновлении:

with y as 
(
  select [PartUsedId],
         rdi.[ReturnedQuantity] 
  from [BusOprtn].[dbo].[RepairItem] as ri 
    inner join @RepairedItems as rdi 
      on ri.Id=rdi.id 
), x as
(
  SELECT [PartNo],
         [ManufacturerId],
         [ReturnedQuantity] 
  FROM [BusOprtn].[dbo].[PartUsed] as p 
    inner join y 
      on p.id = y.PartUsedId
)
UPDATE [BusOprtn].[dbo].[ProductMaster] 
SET [RepairedStock] = ([RepairedStock]+x.[ReturnedQuantity]) 
from [BusOprtn].[dbo].[ProductMaster] as pm 
  inner join x 
    on x.[PartNo]=pm.Id;

Второй оператор обновления:

UPDATE [BusOprtn].[dbo].[ProductStockManufacturer] 
SET  [RepairedCurrentStock] = ([RepairedCurrentStock]+x.[ReturnedQuantity]) 
from [BusOprtn].[dbo].[ProductStockManufacturer] as pm 
  inner join x 
    on x.[PartNo]=pm.[ProductNo] and x.[ManufacturerId]= pm.[ManufacturerId];
0

Вы можете попробовать использовать SQL Server Profiler (Service меню в MSSMS). Там вы можете найти, какой именно запрос получил. Возможно, что-то другое.

Надеюсь, это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню