Как получить значение всех аргументов хранимой процедуры динамически в SQL? - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь записать все аргументы хранимой процедуры, их тип и их значение.

Цель состоит в том, чтобы я мог сохранить аргументы в таблице журнала в формате 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 хранимых процедур в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...