如何检索存储过程的标题的一部分?

时间:2015-06-17 11:24:11

标签: sql-server sql-server-2008 stored-procedures

我有一个C#WinForms应用程序,用于管理不同服务使用的存储过程。用户看到的是这样的:

exec stored_procedure_name param1, param2, param3

由于param1对它们没有任何意义(它们看不到存储过程),我想向它们呈现通常保存在存储过程标题中的参数的小描述。

典型的存储过程需要:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[stored_procedure_name]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[stored_procedure_name]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

/*************************************************************************************
[Procedure Info]
Author = myName
Description = this stored procedure returns results.

**************************************************************************************
[Parameters Info]
@param1 = this is parameter one
@param2 = this is parameter two
@param3 = this is parameter three

**************************************************************************************
[Changes]
2015-06-17  The stored procedure is optimized.

*/

CREATE PROCEDURE [dbo].[stored_procedure_name]
@param1 int,
@param2 nvarchar(20),
@param3 nvarchar(10)
AS
BEGIN
    -- SP code here
END
GO

从上面,我想获得参数信息中的描述。我知道我可以使用以下SQL将存储过程检索为text / table:

CREATE TABLE #tmpHeader
(
   TEXT NVARCHAR(1000)
)

INSERT INTO #tmpHeader
EXEC sp_helptext 'stored_procedure_name';

SELECT * FROM #tmpHeader

DROP TABLE #tmpHeader

如何从这里开始以获取参数信息的内容的任何想法或建议? 我也对任何其他建议持开放态度。

2 个答案:

答案 0 :(得分:4)

考虑使用扩展属性来存储元数据。这比解析模块文本要简洁得多。

修改 下面的示例返回所有参数以及具有扩展属性的参数的描述。在您的代码中,您可以将架构和对象名称作为参数传递,而不是将此处用于说明的局部变量。

EXEC sp_addextendedproperty @name = N'Description',
    @value = 'this is parameter one', @level0type = N'Schema',
    @level0name = 'dbo', @level1type = N'Procedure',
    @level1name = 'stored_procedure_name', @level2type = N'Parameter',
    @level2name = '@param1';
  GO
EXEC sp_addextendedproperty @name = N'Description',
    @value = 'this is parameter two', @level0type = N'Schema',
    @level0name = 'dbo', @level1type = N'Procedure',
    @level1name = 'stored_procedure_name', @level2type = N'Parameter',
    @level2name = '@param2';
  GO
EXEC sp_addextendedproperty @name = N'Description',
    @value = 'this is parameter three', @level0type = N'Schema',
    @level0name = 'dbo', @level1type = N'Procedure',
    @level1name = 'stored_procedure_name', @level2type = N'Parameter',
    @level2name = '@param3';
  GO

DECLARE
      @SchemaName sysname = 'dbo'
    , @ObjectName sysname = 'stored_procedure_name';

SELECT  properties.objtype
      , properties.objname
      , parms.name
      , properties.value
FROM sys.parameters AS parms
LEFT JOIN fn_listextendedproperty('Description', 'Schema', @SchemaName, 'Procedure',
                                @ObjectName, 'Parameter', DEFAULT) AS properties ON
    properties.objname COLLATE DATABASE_DEFAULT = parms.name
WHERE
    parms.object_id = OBJECT_ID(QUOTENAME(@SchemaName) + '.' + QUOTENAME(@ObjectName));
GO

答案 1 :(得分:1)

这应该让你想到你的想法。

SELECT SUBSTRING(definition,CHARINDEX(N'[Parameters Info]',definition),CHARINDEX(N'[',definition,CHARINDEX(N'[Parameters Info]',definition)+1)-CHARINDEX(N'[Parameters Info]',definition))
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('YOUR PROCEDURE!!!')

它搜索参数信息并继续进行,直到找到另一个标题块(以[开头)。您还可以指定它应搜索*。