Я пытаюсь записать все аргументы хранимой процедуры, их тип и их значение.
Цель состоит в том, чтобы я мог сохранить аргументы в таблице журнала в формате XML и создать функцию, которая выводит все аргументы в виде объявлений / установки состояний (это я уже сделал). Это для того, чтобы я мог запустить хранимую процедуру, вызываемую отчетом, с теми же аргументами, что и при вызове отчета БЫСТРО, то есть без необходимости начинать профилирование, фильтрацию, поиск правильное утверждение, и все хлопоты, которые идут с ним, и т.д ..
Я могу легко получить имя и тип аргументов процедуры, используя приведенный ниже SQL (пример). Но я не смог найти способ получить значения аргументов хранимой процедуры динамически.
Было бы жалко, если бы мне пришлось вручную создавать объединение всех аргументов и их типов, просто для их регистрации (не говоря уже о подверженности ошибкам, если есть изменения).
Есть ли способ динамического получения значения аргумента хранимой процедуры в SQL без необходимости жесткого кодирования его имени в каком-нибудь sql-литерале?
----------------- 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'
-- /5586216/tekuschee-imya-ispolnyaemoi-protsedury
-- 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 хранимых процедур в базе данных.