Warum ist die Reihenfolge der Parameter für sp_trace_create wichtig?

7

Der erste Stapel des folgenden Skripts ruft die gespeicherte Prozedur sp_trace_createmit Parametern in der Dokumentationsreihenfolge auf. Die zweite Charge vertauscht die Positionen der Parameter @tracefileund @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

Der erste Stapel erstellt eine neue Ablaufverfolgung, wählt ihre ID aus und schließt die Ablaufverfolgung. Eine Ergebnismenge wird zurückgegeben:

@new_trace_id
2

Der zweite Stapel schlägt mit einem Fehler fehl:

Nachricht 214, Ebene 16, Status 3, Prozedur sp_trace_create, Zeile 1 Die Prozedur erwartet den Parameter '@tracefile' vom Typ 'nvarchar (256)'.

Warum wirkt sich die Parameterreihenfolge auf die Ausgabe der gespeicherten Prozedur aus sp_trace_create? Und warum scheitert es mit einer so irreführenden Fehlermeldung?

Iain Samuel McLean Elder
quelle

Antworten:

6

Ich glaube, das liegt daran, dass es sich um eine erweiterte gespeicherte Prozedur handelt und die Parameternamen tatsächlich vollständig ignoriert werden. Es geht einfach aus der Position.

Ich habe sie wie folgt umbenannt (und ihnen alle den gleichen Namen gegeben) und es funktioniert immer noch gut.

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;

Ein ähnlicher Dokumentationsfehler wurde von Aaron über eingereicht sp_executesql.

Ein weiterer ärgerlicher Aspekt dieser gespeicherten Prozedur ist, dass die @maxfilesizeals 'bigint' übergeben werden muss und keine wörtliche Ganzzahl akzeptiert. Ich gehe davon aus, dass dies auch daran liegt, dass es sich um eine erweiterte gespeicherte Prozedur handelt.

Martin Smith
quelle
1
Wie Aaron sagt, ist es einfacher, eine gespeicherte Prozedur zu lesen und zu debuggen, deren Parameter durch den Namen angegeben werden. Es ist eine meiner Lieblingsfunktionen von T-SQL. Was für eine Schande, dass diese Funktion für erweiterte gespeicherte Prozeduren nicht funktioniert! Möglicherweise ist dies ein Grund dafür, dass erweiterte gespeicherte Prozeduren im Allgemeinen nicht mehr unterstützt werden .
Iain Samuel McLean Elder
0

Dies funktioniert bei mir: Wenn Sie angeben @maxfiles, müssen Sie die Option TRACE_FILE_ROLLOVER( = 2 ) verwenden:

declare @rc int
declare @TraceID int
declare @maxfilesize bigint
declare @maxfiles int

set @maxfilesize = 2        -- Mb per file
set @maxfiles = 10          -- number of files (10 files x 2Mb --> 20 Mb)

-- Please replace the text InsertFileNameHere, with an appropriate
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
-- will be appended to the filename automatically. If you are writing from
-- remote server to local drive, please use UNC path and make sure server has
-- write access to your network share

-- The option @maxfiles it's only admitted if TRACE_FILE_ROLLOVER  (value 2) is set
exec @rc = sp_trace_create @TraceID output, **2**, N'E:\sql\trazas\traza_a', @maxfilesize, NULL, @maxfiles
if (@rc != 0) goto error

-- Set the events
...

Mit dieser Option (2) tritt kein Fehler beim Erstellen der Ablaufverfolgung auf

Juan Miguel Jimenez
quelle