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

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

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, если это помогает.

10 голосов | спросил RoguePlanetoid 8 J0000006Europe/Moscow 2010, 13:53:00

6 ответов


0

В своей хранимой процедуре вы тоже

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
ответил Matthew Abbott 8 J0000006Europe/Moscow 2010, 13:59:02
0

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

Create Proc dbo.usp_Proc1

@Id int,
@Count int output

as begin

select @Count = Count(Item) from tblItem where [email protected]

end
Go

Declare @Count int
Declare @Id int

Set @Id = 1

Exec dbo.usp_Proc1 @Id, @Count output

select @Count
ответил codingbadger 8 J0000006Europe/Moscow 2010, 14:01:30
0

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

DECLARE @Count table(counting INT)
Insert into @Count
EXEC GetItemCount 123 
SELECT Counting FROM @Count 
ответил Madhivanan 8 J0000006Europe/Moscow 2010, 14:33:34
0

Следующее не будет работать, если для выполняемого 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 
ответил MC9000 1 SunEurope/Moscow2013-12-01T23:48:47+04:00Europe/Moscow12bEurope/MoscowSun, 01 Dec 2013 23:48:47 +0400 2013, 23:48:47
0

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

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

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

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

РЕШЕНИЕ 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
ответил santhosh kumar Gudise 2 Maypm12 2012, 14:25:44
0

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

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

    СОЗДАНИЕ ПРОЦЕДУРЫ GetItemCount @ID int, @count int output

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

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

  1. Чтобы объявить таблицу перед вызовом proc и получить это значение в виде столбца.
ответил Mohan Gundlapalli 8 J0000006Europe/Moscow 2010, 14:06:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132