Как использовать значение из одной хранимой процедуры в другую?

У меня есть следующий оператор в хранимой процедуре:

DECLARE @Count INT
EXEC @Count = GetItemCount 123
SELECT @Count

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

SELECT COUNT(Item) FROM tblItem WHERE ID = @ID

однако, когда я тестирую вызов, EXEC выводит значение правильно, но это не назначается переменной @Count правильно. Я видел примеры или хранимые процедуры, используемые таким образом, в том числе здесь, но ни у одного из них не было параметра и возвращаемого значения (которое я мог найти). Параметр ID передается в второй оператор, который возвращает значение count, используемое первым StoredProcedure - вся информация, которую я прочитал, кажется, указывает, что это должно работать - но это не значение @Count всегда равно нулю, даже если GetItemCount возвращает всегда правильное значение.

это в Microsoft SQL Server 2008, если это помогает.

6 ответов


в вашей хранимой процедуре вы либо

a) присвоение значения count выходному параметру:

CREATE PROCEDURE GetItemCount
  @id INT,
  @count INT OUTPUT
AS
  SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id

называют:

DECLARE @count INT
EXEC GetItemCount 123, @count OUTPUT

или, b) присвоение значения count в качестве возвращаемого значения:

CREATE PROCEDURE GetItemCount
  @id INT
AS
BEGIN
  DECLARE @count INT
  SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id

  RETURN @count
END  

называют:

DECLARE @count INT
EXEC @count = GetItemCount 123

вы должны пройти @Count в качестве выходного параметра.

Create Proc dbo.usp_Proc1

@Id int,
@Count int output

as begin

select @Count = Count(Item) from tblItem where id=@Id

end
Go

Declare @Count int
Declare @Id int

Set @Id = 1

Exec dbo.usp_Proc1 @Id, @Count output

select @Count

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

EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT --works
EXEC [dbo].insertproduc, @ProductID OUTPUT -- generates a parameter supplied when not needed error message if the insertproduc does not require parameters.

лучше всего использовать следующий формат для всех случаев (он работает во всех версиях):

DECLARE @MyOutputVariable int 
EXEC @MyOutputVariable  = [dbo].MyStoredProc 

другой способ

DECLARE @Count table(counting INT)
Insert into @Count
EXEC GetItemCount 123 
SELECT Counting FROM @Count 

решение (b), данное г-ном Мэтью, не будет работать, когда u вызовет это в другой хранимой процедуре (конечно, решение (a) отлично работает, когда мы используем выходные параметры). Чередование решения (b) является решением г-на Мадхиванана. я.е, создать временную таблицу и использовать ее потом.

ниже других решений..

мы не можем получить значение из внутреннего выходного предложения в хранимой процедуре напрямую. Поэтому мы должны использовать выходной параметр или возвращаемое значение вместо.

пожалуйста, обратитесь к следующим предложениям:

Решение 1:

CREATE PROCEDURE [dbo].[InsertProduct] 
      @pName varchar(50) 
AS 


BEGIN 
DECLARE @MyTableVar Table(ProductID 
int) 


      INSERT Products 
      ( 
           pName 
      ) 
      OUTPUT Inserted.ProductID 
INTO @MyTableVar 
      VALUES 
      ( 
        @pName 
      ) 
RETURN (SELECT ProductID
FROM @MyTableVar) 
END 


DECLARE @ProductID int 
EXEC @ProductID = [dbo].insertproduc 'TEST' 
SELECT @ProductID 

решение:2

CREATE PROCEDURE [dbo].[InsertProduct]
      @pName varchar(50) , @pID int output
AS

BEGIN 
DECLARE @MyTableVar Table(ProductID int)

      INSERT Products 
      (
           pName 
      )
      OUTPUT Inserted.ProductID INTO @MyTableVar
      VALUES 
      (
        @pName
      )
SELECT @pID=ProductID FROM @MyTableVar
END

DECLARE @ProductID int
EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT
SELECT @ProductID

то, что вы ловите в переменной @Count, - это состояние выполнения хранимой процедуры GetItemCount, а не значение, как вы ожидаете. Чтобы получить это значение, у вас есть два способа.

  1. чтобы объявить другой параметр @count как выходной в GetItemCount. Таким образом, у вас будет объявление GetItemCount следующим образом

    создать процедуру GetItemCount @ID int, @count int output

внутри, вы можете использовать

выберите @count = COUNT (Item) из tblItem, где ID = @ID

  1. чтобы объявить таблицу перед вызовом proc и получить это значение в виде столбца.