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