Есть ли способ сослаться на коллекцию параметров, переданных в хранимый процесс, без ссылки на каждый из них по имени?
Контекст здесь - регистрация ошибок.Я хотел бы разработать общее предложение или подраздел CATCH, который собирает все значения параметров, а также другую информацию об ошибках и выполнении и записывает их в таблицу (одну или несколько).
Базовая версияВыглядит примерно так:
CREATE PROC dbo.Proc1 @Param1 INT, @Param2 INT
AS
BEGIN TRY
SELECT 1/0
END TRY
BEGIN CATCH
DECLARE @params XML
SET @params = (
SELECT
@Param1 AS [Param1]
, @Param2 AS [Param2]
FOR XML PATH('params'), TYPE
)
EXEC dbo.LogError @procid = @@PROCID, @params = @params
EXEC dbo.RethrowError
END CATCH
Теперь этот шаблон работает, за исключением того, что для каждой отдельной процедуры мне придется вручную редактировать раздел SET @params
.
Я мог бы написать егодостаточно легко, но тогда мне все равно нужно было бы скопировать его.
Я мог бы оставить какой-то тип заполнителя, а затем динамически обновлять каждое определение с правильным SET
оператором.Я мог бы даже написать триггер базы данных, который прослушивает операторы CREATE и ALTER PROC, и сделать так, чтобы он делал это для меня автоматически.
Но что я действительно хочу, так это просто получить набор параметров напрямую и покончить с этим.Есть ли способ?
EDIT : недостаточно получить метаданные параметров из системных таблиц.Например:
DECLARE @sql NVARCHAR(MAX)
SET @sql =
'SET @params = (SELECT '
+ STUFF((
SELECT ', '+name+' AS '+STUFF(name,1,1,'')
FROM sys.parameters WHERE object_id = @@PROCID
FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)')
,1,2,'')
+ ' FOR XML PATH(''params''), TYPE)'
-- inline execute here....alas, there's isn't a mode for that
EXEC sp_executesql @sql, N'@params XML OUTPUT', @params OUTPUT
Это, конечно, приводит к ошибке, так как я не объявил параметры для вложенной области действия sp_executesql
.Хотя я мог написать второй параметр sp_executesql
, я не могу назначить их без явного присвоения их по имени за раз.
Оригинальный вопрос, перефразированный : есть другойразновидность sp_executesql
, которая наследует переменную "context" из внешней области видимости, которая выполняется в том же фрейме, который вставляет команду вместо выполнения во вложенной области видимости?