为什么以下程序没有返回参数数量的准确值?

时间:2014-06-02 11:53:59

标签: sql stored-procedures

我编写了下面的程序来检索存储过程中的参数数量。但是它没有返回准确的值,而且我写的问题中也没有出现一些程序。如何编辑列出所有程序并返回参数数量?

CREATE PROC test_op @name varchar(100), @count int OUTPUT
AS
SELECT  @count =COUNT (INFORMATION_SCHEMA.PARAMETERS.PARAMETER_NAME)
FROM    INFORMATION_SCHEMA.PARAMETERS
GROUP BY INFORMATION_SCHEMA.PARAMETERS.SPECIFIC_NAME,INFORMATION_SCHEMA.PARAMETERS.SPECIFIC_SCHEMA

DECLARE @count1 int
EXEC test_op usp_GetDBTime, @count=@count1 OUTPUT
Print @count1

2 个答案:

答案 0 :(得分:0)

您正在按参数名称进行分组,因此查询会返回多个值。其中一个是分配给输出变量。

如果您想要一个程序的号码,请使用where代替group by

CREATE PROC test_op (
    @name varchar(100),
    @count int OUTPUT
)
AS
BEGIN
    SELECT  @count =COUNT(p.PARAMETER_NAME)
    FROM INFORMATION_SCHEMA.PARAMETERS p
    WHERE p.SPECIFIC_NAME = @name;
END;

DECLARE @count1 int;
EXEC test_op 'usp_GetDBTime', @count = @count1 OUTPUT
Print @count1;

您可能希望在过程中包含架构名称。

答案 1 :(得分:0)

最重要的问题是您不能按@name进行过滤。但是,即使在内部,您也可能遇到不同模式中重复名称的问题。这应该合理可靠地工作 - 解决这两个问题,同时支持更好的@name格式('Foo' vs 'dbo.Foo'等):

ALTER PROC test_op @name sysname -- or CREATE the first time
AS
DECLARE @id int = OBJECT_ID(@name);
DECLARE @schema sysname = OBJECT_SCHEMA_NAME(@id);
SET @name = OBJECT_NAME(@id);
RETURN (
    SELECT COUNT(INFORMATION_SCHEMA.PARAMETERS.PARAMETER_NAME)
    FROM INFORMATION_SCHEMA.PARAMETERS
    WHERE SPECIFIC_NAME = @name AND SPECIFIC_SCHEMA = @schema)
GO
DECLARE @count1 int;
EXEC @count1 = test_op 'test_op' -- etc
Print @count1