Есть ли способ ссылаться на набор параметров, передаваемых хранимой процедуре, без ссылки на каждый из них по имени? - PullRequest
2 голосов
/ 13 сентября 2010

Есть ли способ сослаться на коллекцию параметров, переданных в хранимый процесс, без ссылки на каждый из них по имени?

Контекст здесь - регистрация ошибок.Я хотел бы разработать общее предложение или подраздел 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" из внешней области видимости, которая выполняется в том же фрейме, который вставляет команду вместо выполнения во вложенной области видимости?

1 Ответ

0 голосов
/ 18 сентября 2010

Почему бы не использовать sys.dm_exec_sql_text (@sql_handle) для извлечения команды SQL, используя sys.sysprocesses.sql_handle?

...