SQL Server 2008 Try / Catch имена и значения параметров - PullRequest
0 голосов
/ 22 ноября 2011

Я искал, но не смог найти, как получить имена параметров и значения хранимой процедуры из раздела catch команды try / catch в SQL Server 2008.

Я знаю, как получить параметры, например:

SELECT  parm.name AS Parameter
        ,typ.name AS [Type]
FROM    sys.procedures sp
        JOIN sys.parameters parm ON sp.object_id = parm.object_id
        JOIN sys.types typ ON parm.system_type_id = typ.system_type_id
WHERE   sp.name = OBJECT_NAME(@@procid)

В основном я ищу SP, который выполняется с параметрами и значениями, чтобы я мог регистрировать и устранять неполадки. Что-то вроде:

wsp_GetUser_s @UserID = 123, @UserName = 'juser'

1 Ответ

0 голосов
/ 30 октября 2018

В блоке 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
...