【问题标题】:TSql Getting meta data of stored procedure parametersTSql 获取存储过程参数的元数据
【发布时间】:2017-01-26 21:05:41
【问题描述】:

有这样的简单存储过程:

CREATE PROCEDURE [dbo].[ProcedureName]
    @p1IntMandatory INT ,
    @p2IntDefValueZero INT = 0 ,
    @p3VarcharWzValue VARCHAR(MAX) = 'abc' ,
    @p4DateTimeNullable DATETIME = NULL ,
    @p5IntOutWzValueZero INT = 0 OUTPUT
AS
BEGIN

    SET NOCOUNT ON;

END;

在运行此语句获取存储过程参数元数据特别是“has_default_value”、“default_value”和“is_nullable”列时,我发现它们的值无效。

SELECT  *
FROM    sys.parameters
WHERE   object_id = OBJECT_ID('[dbo].[ProcedureName]');

这是结果:

name                    has_default_value   default_value   is_nullable
@p1IntMandatory         0                   NULL            1
@p2IntDefValueZero      0                   NULL            1
@p3VarcharWzValue       0                   NULL            1
@p4DateTimeNullable     0                   NULL            1
@p5IntOutWzValueZero    0                   NULL            1

是否有正确的方法来获取有关存储过程的有效元数据,特别是这 3 列?

【问题讨论】:

  • documentation中:SQL Server只维护这个目录视图中CLR对象的默认值;因此,对于 Transact-SQL 对象,此列的值为 0。要查看 Transact-SQL 对象中参数的默认值,请查询 sys.sql_modules 目录视图的定义列,或使用 OBJECT_DEFINITION 系统函数。
  • 必须从 sys.sql_modules 或类似的东西中解析定义
  • 解决方案:需要将存储过程读取为纯文本并手动解析。

标签: sql-server tsql stored-procedures


【解决方案1】:

这里有一个半路开始给你一个 hack。这不是一个解决方案,但评论时间太长,但也许会让你开始。这是一种尝试将您的过程创建提取到“as”。

SELECT
    --charindex('create proc',[definition]) as SubstringStartLocation
    --,charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) SubStringLength
    substring([definition],charindex('create proc',[definition]),charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) - 1) as ProcCreation
    ,definition as ProcDefinition
FROM    sys.sql_modules 
WHERE definition like '%create proc%'

然后您将不得不解析该列,这可能会变得非常棘手,但希望这会有所帮助。

这里更进一步......

if object_id('tempdb..#procs') is not null drop table #procs

SELECT
    --charindex('create proc',[definition]) as SubstringStartLocation
    --,charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) SubStringLength
    substring([definition],charindex('create proc',[definition]),charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) - 1) as ProcCreation
    ,definition as ProcDefinition
into #procs
FROM    sys.sql_modules 
WHERE definition like '%create proc%'


select
    ProcCreation
    ,right(rtrim(ProcCreation),len(ProcCreation) - charindex('@',ProcCreation) + 1) as Variables
from #procs
where ProcCreation like '%@%'

【讨论】:

  • 虽然这是一个试验,但我更喜欢一种适当的方式,而不是自己重度解析存储过程。
  • @MohammedOsman 如文档中所述,它们没有存储在任何地方,因此任何解决方案都必须是定制的。不过,我不知道你所说的“正确”是什么。
  • 如何依赖解析存储过程文本?!无法获取此 SP 参数(例如)。 -- ================= -- Author: -- Create date: 08/06/2012 -- Description: -- EXEC [dbo].[PROCEDURE] @userName = 'Mohammed', @password = 'q+z6QksS1Qg=', @roleId = 1; -- EXEC [dbo].[PROCEDURE] @userName = 'Mohammed', @password = 'q+z6QksS1Qg=', @roleId = 2; -- =========================================== CREATE PROCEDURE [dbo].[PROCEDURE2] ( @userName NVARCHAR(50) , @password NVARCHAR(50) , @roleId INT ) AS BEGIN SET NOCOUNT ON ; END
  • 如果将注释块放在所有程序中对您来说是一种标准,那么我们可以围绕它编写代码,但没有适合每个人的完美解决方案
猜你喜欢
  • 2014-07-07
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 2018-05-09
  • 2011-02-20
  • 1970-01-01
相关资源
最近更新 更多