8

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

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

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

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

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

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

+0

Я был в состоянии получить эту работу - имеющий выход в качестве параметра было решение - забываю SQL не похож на стиль программирования, к которому я привык. – RoguePlanetoid

ответ

22

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

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

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 

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

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 
+0

Спасибо за это - он сработал - не думал, что выход будет параметром - вот почему я не мог понять это, я обрабатывал вывод дисплея как результат, когда на самом деле ничего не возвращалось - отсюда почему он был равен нулю, когда Я прочитал это значение. – RoguePlanetoid

+0

Искали эту проблему несколько раз с тех пор, как я задал этот вопрос, и вернулся сюда и нашел решение, желая, чтобы каждый голос помогал мне! – RoguePlanetoid

2

Вы должны пройти @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 
+0

Этот пример также был полезен, чтобы мой запрос работал правильно, поэтому еще раз спасибо. – RoguePlanetoid

0

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

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

    CREATE PROCEDURE GetItemCount @ID INT, @count Int выходной

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

ВЫБРАТЬ @count = COUNT (Item) FROM tblItem WHERE ID = @ID

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

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

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

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

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

Мы не можем получить значение из внутреннего пункта 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 
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 
Смежные вопросы