10

考虑以下 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参数传入?

4

5 回答 5

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)
于 2017-09-01T13:00:09.140 回答
1

其实有一个很简单的方法!

通过设置默认值使参数可选(@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 值的默认值。

于 2018-08-13T07:58:55.137 回答
0

使用以下查询获取所有参数的名称并检查它是否为输出参数:

select name, is_output from sys.parameters
于 2017-06-12T08:57:57.083 回答
0

也许我错了,但我不相信这是可能的。OUTPUT 是存储过程定义的一部分,因此您应该知道参数何时是或不是 OUTPUT。无法动态设置它,因此我认为通过代码确定何时输出参数是没有意义的,因为您已经知道它。

如果您正在尝试编写动态代码,Piotr Lasota 的回答应该会促使您正确地了解参数何时为输出。

于 2016-07-12T15:34:13.220 回答
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:[数据库] -> 可编程性 -> 存储过程 -> [过程] -> 参数

于 2016-04-18T10:50:16.087 回答