我正在尝试记录存储过程的所有参数,它们的类型和值。
目的是我可以将参数作为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个存储过程。