В блоке catch Microsoft SQL Server отсутствует функция, позволяющая автоматически регистрировать, какие параметры переданы объекту базы данных.
Если вы хотите узнать, какие параметры передаются, я рекомендую запустить трассировку или использовать расширенные события.
Если ни один из этих вариантов не выполним, я рекомендую создать таблицу для хранения этой информации. Один столбец может иметь имя хранимой процедуры, а другой столбец может иметь параметры. Столбец параметров может содержать разделенный запятыми список параметров, которые были переданы в хранимую процедуру.
Пример:
create table dbo.Parameters (
RowID int identity(1,1),
StoredProcedure varchar(255),
Parameters varchar(max)
)
create proc dbo.wsp_GetUser_s (
@UserID int,
@UserName varchar(255)
)
as
begin try
select *
from dbo.Users
where UserID = @UserID
and UserName = @UserName
-- We'll only log to the Parameters table if we don't find a match
if @@rowcount < 1
begin
RAISERROR ('Did not find user. Logging passed parameters to dbo.Parameters table', -- Message text.
16, -- Severity.
1 -- State.
);
end
end try
begin catch
-- This could be moved into the catch block if you wanted to log this for all calls and not only when there is no match found for the passed in parameters.
insert into dbo.Parameters ( StoredProcedure, Parameters)
select 'wsp_GetUser_s', '@UserID=' + @UserID + ', @UserName=' + @UserName
end catch