Как использовать значение из одной хранимой процедуры в другой? - PullRequest
11 голосов
/ 08 июня 2010

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

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

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

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

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

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

Ответы [ 6 ]

26 голосов
/ 08 июня 2010

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

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

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) Назначение значения счетчика в качестве возвращаемого значения:

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
3 голосов
/ 08 июня 2010

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

DECLARE @Count table(counting INT)
Insert into @Count
EXEC GetItemCount 123 
SELECT Counting FROM @Count 
2 голосов
/ 01 декабря 2013

Следующее не будет работать, если для выполняемого 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 
2 голосов
/ 08 июня 2010

Вы должны передать @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
1 голос
/ 02 мая 2012

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

Ниже приведены другие решения.

Мы не можем получить значение из внутреннего предложения OUTPUT в хранимой процедуре напрямую.Поэтому мы должны использовать вместо этого параметр OUTPUT или ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ.

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

РЕШЕНИЕ 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
0 голосов
/ 08 июня 2010

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

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

    ПРОЦЕДУРА СОЗДАНИЯ GetItemCount @ID int, выход @count int

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

SELECT @count = COUNT (Item) FROM tBlItem WHERE ID = @ ID

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