考虑以下T-SQL代码片段:
CREATE PROC dbo.SquareNum(@i INT OUTPUT)
AS
BEGIN
SET @i = @i * @i
--SELECT @i
END
GO
DECLARE @a INT = 3, @b INT = 5
EXEC dbo.SquareNum @a OUTPUT
EXEC dbo.SquareNum @b
SELECT @a AS ASQUARE, @b AS BSQUARE
GO
DROP PROC dbo.SquareNum
结果集是:
ASQUARE BSQUARE
----------- -----------
9 5
可以看出,@b
没有平方,b / c它没有作为输出参数传入(传递参数时没有OUTPUT
限定符。)
我想知道是否有一种方法可以检查存储过程体(在本例中为dbo.SquareNum体),以查看参数是否确实已作为OUTPUT
参数传入?
答案 0 :(得分:1)
------ THIS WILL GIVE YOU THE BOTH VALUE IN squared------
CREATE PROC dbo.SquareNum(@i INT OUTPUT)
AS
BEGIN
SET @i = @i * @i
--SELECT @i
END
GO
DECLARE @a INT = 3, @b INT = 5
EXEC dbo.SquareNum @a OUTPUT
EXEC dbo.SquareNum @b OUTPUT
SELECT @a AS ASQUARE, @b AS BSQUARE
GO
DROP PROC dbo.SquareNum
-----TO CHECK STORED PROCEDURE BODY-----
SELECT OBJECT_NAME(object_id),
OBJECT_DEFINITION(object_id)
FROM sys.procedures
WHERE OBJECT_DEFINITION(object_id) =(SP_NAME)
答案 1 :(得分:0)
您可以通过查询sys视图来执行此操作:
select
p.name as proc_name,
par.name as parameter_name,
par.is_output
from sys.procedures p
inner join sys.parameters par on par.object_id=p.object_id
where p.name = 'SquareNum'
或在数据库树中签入Management Studio: [数据库] - >可编程性 - >存储过程 - > [程序] - >参数
答案 2 :(得分:0)
也许我错了,但我不相信这是可能的。 OUTPUT是存储过程定义的一部分,因此您应该知道参数何时是OUTPUT。没有办法动态设置它所以我认为通过代码确定何时输出参数是没有意义的,因为你已经知道了。
如果您正在尝试编写动态代码,Piotr Lasota的答案应该引导您以正确的方式实现参数何时输出。
答案 3 :(得分:0)
使用以下查询获取所有参数的名称并检查它是否为输出参数:::
select name, is_output from sys.parameters
答案 4 :(得分:0)
实际上,有一种非常简单的方法!
通过设置默认值(@Qty AS Money = 0,下方)使参数为可选
然后,在调用过程时传递除默认值以外的值。然后立即测试该值,如果它不是默认值,则表示已传递变量。
Create Procedure MyProcedure(@PN AS NVarchar(50), @Rev AS NVarchar(5), @Qty AS Money = 0 OUTPUT) AS BEGIN
DECLARE @QtyPassed AS Bit = 0
IF @Qty <> 0 SET @QtyPassed = 1
当然,这意味着该变量不能用于OUTPUT以外的任何其他功能,除非您拥有一个默认值,该值将永远不会用作INPUT值。
答案 5 :(得分:-1)
查看存储过程正文
exec sp_helptext''