gotchasqlMinor
Why does the order of parameters matter for sp_trace_create?
Viewed 0 times
whytheordersp_trace_createfordoesparametersmatter
Problem
The first batch of the following script calls stored procedure
The first batch creates a new trace, selects its id, and then closes the trace. One result set is returned:
The second batch fails with an error:
Msg 214, Level 16, State 3, Procedure sp_trace_create, Line 1
Procedure expects parameter '@tracefile' of type 'nvarchar(256)'.
Why does parameter order affect the output of stored procedure
sp_trace_create with parameters in documentation order; the second batch swaps the positions of parameters @tracefile and @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;
GOThe first batch creates a new trace, selects its id, and then closes the trace. One result set is returned:
@new_trace_id
2The second batch fails with an error:
Msg 214, Level 16, State 3, Procedure sp_trace_create, Line 1
Procedure expects parameter '@tracefile' of type 'nvarchar(256)'.
Why does parameter order affect the output of stored procedure
sp_trace_create? And why does it fail with such a misleading error message?Solution
I believe this is because it is an extended stored procedure and the parameter names are actually entirely ignored. It just goes off position.
I have renamed them as below (and given them all the same name) and it still works fine.
A similar documentation bug was filed by Aaron about
Another annoying aspect of that stored procedure is that the
I have renamed them as below (and given them all the same name) and it still works fine.
DECLARE @new_trace_id INT;
EXECUTE master.dbo.sp_trace_create
@rubbish = @new_trace_id OUTPUT,
@rubbish = 0,
@rubbish = 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;A similar documentation bug was filed by Aaron about
sp_executesql.Another annoying aspect of that stored procedure is that the
@maxfilesize must be passed as 'bigint' and it doesn't accept a literal integer. I assume that this is also because it is an extended stored procedure.Code Snippets
DECLARE @new_trace_id INT;
EXECUTE master.dbo.sp_trace_create
@rubbish = @new_trace_id OUTPUT,
@rubbish = 0,
@rubbish = 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;Context
StackExchange Database Administrators Q#17760, answer score: 6
Revisions (0)
No revisions yet.