O primeiro lote do script a seguir chama o procedimento armazenado sp_trace_create
com parâmetros na ordem da documentação; o segundo lote troca as posições dos parâmetros @tracefile
e @options
:
DECLARE @new_trace_id INT;
EXECUTE master.dbo.sp_trace_create
@trace_id = @new_trace_id OUTPUT,
@options = 0,
@tracefile = N'C:\temp\TestTrace';
SELECT @new_trace_id AS [@new_trace_id];
EXECUTE master.dbo.sp_trace_setstatus
@trace_id = @new_trace_id,
@status = 2;
GO
DECLARE @new_trace_id INT;
EXECUTE master.dbo.sp_trace_create
@trace_id = @new_trace_id OUTPUT,
@tracefile = N'C:\temp\TestTrace',
@options = 0;
EXECUTE master.dbo.sp_trace_setstatus
@trace_id = @new_trace_id,
@status = 2;
GO
O primeiro lote cria um novo rastreamento, seleciona seu id e fecha o rastreamento. Um conjunto de resultados é retornado:
@new_trace_id
2
O segundo lote falha com um erro:
Msg 214, Nível 16, Estado 3, Procedimento sp_trace_create, Linha 1 O procedimento espera o parâmetro '@tracefile' do tipo 'nvarchar(256)'.
Por que a ordem dos parâmetros afeta a saída do procedimento armazenado sp_trace_create
? E por que ele falha com uma mensagem de erro tão enganosa?
Acredito que seja porque é um procedimento armazenado estendido e os nomes dos parâmetros são totalmente ignorados. Apenas sai da posição.
Eu os renomeei como abaixo (e dei a todos o mesmo nome) e ainda funciona bem.
Um bug de documentação semelhante foi registrado por Aaron sobre
sp_executesql
.Outro aspecto irritante desse procedimento armazenado é que
@maxfilesize
deve ser passado como 'bigint' e não aceita um inteiro literal. Presumo que isso também ocorra porque é um procedimento armazenado estendido.Isso funciona para mim: se você especificar
@maxfiles
, deverá usar a opçãoTRACE_FILE_ROLLOVER
( = 2 ):Com esta opção (2) não há erro ao criar o trace