web-dev-qa-db-ja.com

sp_trace_createでパラメーターの順序が重要なのはなぜですか?

次のスクリプトの最初のバッチは、ストアドプロシージャを呼び出します sp_trace_create パラメータ付きのドキュメント順; 2番目のバッチは、パラメーターの位置を入れ替えます@tracefileおよび@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

最初のバッチは新しいトレースを作成し、そのIDを選択してから、トレースを閉じます。 1つの結果セットが返されます。

@new_trace_id
2

2番目のバッチはエラーで失敗します。

メッセージ214、レベル16、状態3、プロシージャsp_trace_create、行1プロシージャでは、タイプ 'nvarchar(256)'のパラメータ '@tracefile'が必要です。

パラメータの順序がストアドプロシージャの出力に影響するのはなぜですかsp_trace_create?そしてなぜそのような誤解を招くエラーメッセージで失敗するのですか?

これは拡張ストアドプロシージャであり、パラメーター名は実際には完全に無視されるためです。オフの位置になります。

私はそれらを以下のように名前を変更しました(そしてそれらにすべて同じ名前を付けました)、それはまだうまくいきます。

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;

同様のドキュメントのバグsp_executesqlについてアーロンによって提出されました。

そのストアドプロシージャのもう1つの厄介な側面は、@maxfilesizeを 'bigint'として渡す必要があり、リテラル整数を受け入れないことです。これも拡張ストアドプロシージャであるためだと思います。

6
Martin Smith

これは私にとっては機能します:@maxfilesを指定する場合は、オプションTRACE_FILE_ROLLOVER= 2)を使用する必要があります。

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
...

このオプション(2)の場合、トレースの作成中にエラーは発生しません

0