我在存储过程中有以下声明:
DECLARE @Count INT
EXEC @Count = GetItemCount 123
SELECT @Count
使用以下语句调用另一个存储过程:
SELECT COUNT(Item) FROM tblItem WHERE ID = @ID
然而,当我测试呼叫时,EXEC正确输出值但是它 未正确分配给@Count变量。 我见过这样的例子或存储过程,包括这里,但没有一个参数和使用的返回值(我可以找到)。 ID参数被传递到第二个语句,该语句返回第一个StoredProcedure使用的计数值 - 我读过的所有信息似乎表明这应该有效 - 但即使GetItemCount,@ Count值也不会为零。始终返回正确的值。
如果有帮助的话,这是在Microsoft SQL Server 2008中。
答案 0 :(得分:25)
在您的存储过程中,您要么是
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
答案 1 :(得分:3)
另一种方式
DECLARE @Count table(counting INT)
Insert into @Count
EXEC GetItemCount 123
SELECT Counting FROM @Count
答案 2 :(得分:2)
您应该将@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
答案 3 :(得分:2)
如果执行的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
答案 4 :(得分:1)
当你在另一个存储过程中调用它时,Matthew先生给出的解决方案(b)将不起作用(当我们使用OUTPUT参数时,Ofcourse解决方案(a)完美地工作)。 解决方案(b)的替代是Mr.Madhivanan的解决方案。即,创建一个临时表并使用它然后删除它。
以下是其他解决方案..
我们无法直接从存储过程中的内部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
答案 5 :(得分:0)
您在变量@Count中捕获的是存储过程GetItemCount的执行状态,而不是您期望的值。要捕获该值,您有两种方法。
在GetItemCount中将另一个参数@count声明为OUTPUT。因此,您将获得如下的GetItemCount声明
CREATE PROCEDURE GetItemCount @ID int,@ count int output
在里面,你可以使用
SELECT @count = COUNT(Item)FROM tblItem WHERE ID = @ID
答案 6 :(得分:0)
阅读所有答案后将其简化。使用了两个输入和两个输出参数。
确保在存储过程中为输出参数分配了一些值。
我的存储过程:
CREATE PROCEDURE [dbo].[MyStoredProcedure]
(@InParam1 VARCHAR(20) = NULL,
@InParam2 VARCHAR(20) = '',
@OutParam1 VARCHAR(20) = NULL OUT,
@OutParam2 VARCHAR(20) = NULL OUT)
AS
BEGIN
SET @OutParam1 = 'Whatever you want to return'
SET @OutParam2 = 'Whatever you want to return'
RETURN 0; --This is final value any SP returns by default 0
END
调用此存储过程-我使用了两个输出参数,因此我们需要在执行存储过程之前对其进行声明:
DECLARE @OutParam1 VARCHAR(20)
DECLARE @OutParam2 VARCHAR(20)
即使您最终不需要使用存储过程,也可以使用任何变量(例如@Var),但这将设置输出参数而不会像返回一样返回任何数据:
方法1:
DECLARE @Var INT
EXEC @Var = MyStoredProcedure 'InParam1', 'InParam2', @OutParam1 OUT, @OutParam2 OUT
如果要从存储过程中返回一些select语句,并希望使用这些值,则可以将它们保存在临时表中,也可以仅用作选择查询。
方法2:
插入临时表
@DECLARE @TableTemp TABLE
(
Column1 VARCHAR(20),
Column2 VARCHAR(20)
)
INSERT INTO @TableTemp
EXEC MyStoredProcedure 'InParam1', 'InParam2', @returnParam1 OUT, @returnParam2 OUT
这将设置MyStoredProcedure
的两个输出参数,并插入从MyStoredProcedure
传递的值作为选择语句。
方法3:
要简单地将返回值用作表数据,我们可以使用以下方法:
EXEC MyStoredProcedure 'InParam1', 'Inparam2', @returnParam1 OUT, @returnParam2 OUT
在以上所有情况下,始终会设置输出参数。
答案 7 :(得分:0)
您也可以根据Madhivanan的答案尝试以下操作:
DECLARE @tblItem table(Item INT)
DECLARE @Count INT
Insert into @tblItem
EXEC GetItemCount 123
SELECT @Count = Item FROM @tblItem