如何在SQL中动态获取所有存储过程参数的值?

时间:2019-05-27 09:04:23

标签: sql sql-server logging dynamic-sql sql-server-2017

我正在尝试记录存储过程的所有参数,它们的类型和值。

目的是我可以将参数作为XML存储在日志表中,并创建一个将所有参数作为声明/设置状态菜单输出的函数(我已经完成了此操作)。这样做的目的是,我可以运行一个由报告调用的存储过程,该存储过程的参数与该报告被快速调用时的参数相同,也就是说,不必费心启动分析,过滤,搜索正确的声明,以及随之而来的所有麻烦,等等。

我可以使用下面的SQL(示例)轻松地获得过程参数的名称和类型。但是我无法做的是找到一种动态获取存储过程参数值的方法。

如果我不得不手动构建所有参数及其类型的并集,仅记录它们,那将很可惜(更不用说容易出错的更改)。

是否有一种方法可以在SQL中动态获取存储过程参数的值,而不必在某些sql-literal中硬编码其名称?

----------------- This would be the procedure arguments 
DECLARE @bar varchar(MAX) 
SET @bar = 'test123'
-- SET @bar = NULL 


DECLARE @foo table(id int) 
INSERT INTO @foo SELECT BE_ID FROM T_Benutzer;
-- SELECT * FROM @foo 
----------------- End of procedure arguments 


SELECT 
     PARAMETER_NAME AS n 
    ,DATA_TYPE + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS varchar(36)) + ')' AS t 
    ,@bar AS v
    ,CASE 
        WHEN ('data_type'='not_like_table') THEN @bar 
        ELSE (SELECT * FROM @foo FOR XML PATH('row'), root('table'), elements xsinil  )
    END AS v 
FROM INFORMATION_SCHEMA.PARAMETERS 
WHERE (1=1) 
AND SPECIFIC_NAME = 'current_procedure_name' 
-- https://stackoverflow.com/questions/6034488/current-executing-procedure-name
-- OBJECT_NAME(@@PROCID) AS current_procedure_name 

-- FOR XML PATH('row'), root('table'), elements xsinil 

现在沿着

DECLARE @Attribute varchar(MAX) 
SET @Attribute = 'Word' 

DECLARE @foo varchar(MAX) 
SET @foo = 'sql:variable("@Attribute")'


DECLARE @xml xml 
SET @xml = '' 
-- SELECT @xml.value('sql:variable("@Attribute")',  'varchar(max)') 
SELECT @xml.value(@foo,  'varchar(max)') 

本来不错,但是如您所见,XML.value期望使用文字而不是变量。

我尝试过

EXECUTE('
DECLARE @xml xml 
SET @xml = '''' 
SELECT @xml.value(''sql:variable("@Attribute")'',  ''varchar(max)'') 
')

但是不能解析@Attribute。 关于如何实现这一目标的任何线索?

我要避免的是必须手动输入:

SELECT * FROM 
(
          SELECT '@bar' AS n, 'varchar(MAX)' AS t,  @bar AS v 
    UNION SELECT '@foo' AS n, 'table(id int)' AS t, (SELECT * FROM @foo FOR XML PATH('row'), root('table'), elements xsinil ) AS v 
) AS i_dont_want_to_manually_type_this_for_every_stored_procedure 
FOR XML PATH('row'), root('table'), elements xsinil

对于数据库中的所有357个存储过程。

0 个答案:

没有答案