Как использовать значение из одной хранимой процедуры в другую?
У меня есть следующий оператор в хранимой процедуре:
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, а не значение, как вы ожидаете. Чтобы получить это значение, у вас есть два способа.
-
чтобы объявить другой параметр @count как выходной в GetItemCount. Таким образом, у вас будет объявление GetItemCount следующим образом
создать процедуру GetItemCount @ID int, @count int output
внутри, вы можете использовать
выберите @count = COUNT (Item) из tblItem, где ID = @ID
- чтобы объявить таблицу перед вызовом proc и получить это значение в виде столбца.