Значения параметров недоступны при общем подходе.Вы можете создать генератор кода, который будет использовать sys.parameters для создания фрагмента кода, который вам нужно будет скопировать в каждый из ваших SP, или вы можете прочитать это или это о трассировке и XEvents.SQL-Server-Profiler работает таким образом, чтобы показывать вам операторы вместе со значениями параметров ...
Если вы не хотите заниматься трассировкой или XEvents, вы можете попробовать что-то подобное:
- Создать фиктивный процесс
CREATE PROCEDURE dbo.[ThisIsMyTestProc] (
@param1 TINYINT = NULL
, @Param2 NVARCHAR(64) = null
)
AS
BEGIN
SELECT @@PROCID;
END
GO
- вызвать его, чтобы увидеть значение @@PROCID
EXEC dbo.ThisIsMyTestProc; --See the proc-id
GO
- Теперь это магическая часть.Он создаст команду, которую вы можете скопировать и вставить в ваш SP:
SELECT CONCAT('INSERT INTO YourLoggingTable(LogType,ObjectName,ObjectId,Parameters) SELECT ''ProcedureCall'', ''',o.[name],''',',o.object_id,','
,'(SELECT'
,STUFF((
SELECT CONCAT(',''',p.[name],''' AS [parameter/@name],',p.[name],' AS [parameter/@value],''''')
FROM sys.parameters p
WHERE p.object_id=o.object_id
FOR XML PATH('')
),1,1,'')
,' FOR XML PATH(''''),ROOT(''parameters''),TYPE)'
)
FROM [sys].[objects] o
WHERE o.object_id = 525244926; --<-- Use the proc-id here
- Теперь мы можем скопировать строку в нашу процедуру
- Я прокомментировал часть INSERT,SELECT достаточно, чтобы показать эффект
ALTER PROCEDURE dbo.[ThisIsMyTestProc] (
@param1 TINYINT = NULL
, @Param2 NVARCHAR(64) = null
)
AS
BEGIN
--The generated code comes in one single line
--INSERT INTO YourLoggingTable(LogType,ObjectName,ObjectId,Parameters)
SELECT 'ProcedureCall'
,'ThisIsMyTestProc'
,525244926
,(SELECT'@param1' AS [parameter/@name],@param1 AS [parameter/@value],''
,'@Param2' AS [parameter/@name],@Param2 AS [parameter/@value],''
FOR XML PATH(''),ROOT('parameters'),TYPE)
END
GO
Подсказка: нам нужен пустой элемент (,''
) в конце каждой строки, чтобы разрешить несколько элементов с одинаковым именем.
- Теперь мы можем вызвать SP с некоторыми значениями параметров
EXEC dbo.ThisIsMyTestProc 1,'hello';
GO
В результате ваша таблица журналов получит такую запись
ProcedureCall ThisIsMyTestProc 525244926 <parameters>
<parameter name="@param1" value="1" />
<parameter name="@Param2" value="hello" />
</parameters>
Простодобавить типичные данные регистрации, такие как UserID, DateTime, все, что вам нужно ...