次のスクリプトの最初のバッチは、ストアドプロシージャを呼び出します 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'として渡す必要があり、リテラル整数を受け入れないことです。これも拡張ストアドプロシージャであるためだと思います。
これは私にとっては機能します:@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)の場合、トレースの作成中にエラーは発生しません