Tại sao thứ tự của các tham số quan trọng đối với sp_trace_create?


7

Lô đầu tiên của tập lệnh sau gọi thủ tục được lưu trữ sp_trace_createvới các tham số theo thứ tự tài liệu; lô thứ hai hoán đổi vị trí của các tham số @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

Lô đầu tiên tạo một dấu vết mới, chọn id của nó và sau đó đóng dấu vết. Một bộ kết quả được trả về:

@new_trace_id
2

Lô thứ hai không thành công với lỗi:

Msg 214, Cấp 16, Trạng thái 3, Quy trình sp_trace_create, Quy trình Dòng 1 mong đợi tham số '@tracefile' thuộc loại 'nvarchar (256)'.

Tại sao thứ tự tham số ảnh hưởng đến đầu ra của thủ tục được lưu trữ sp_trace_create? Và tại sao nó thất bại với một thông báo lỗi sai lệch như vậy?

Câu trả lời:


6

Tôi tin rằng điều này là do nó là một thủ tục được lưu trữ mở rộng và các tên tham số thực sự bị bỏ qua hoàn toàn. Nó chỉ đi ra khỏi vị trí.

Tôi đã đổi tên chúng như dưới đây (và đặt cho chúng cùng tên) và nó vẫn hoạt động tốt.

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;

Một lỗi tài liệu tương tự đã được nộp bởi Aaron về sp_executesql.

Một khía cạnh khó chịu khác của thủ tục được lưu trữ đó là @maxfilesizephải được thông qua là 'bigint' và nó không chấp nhận một số nguyên bằng chữ. Tôi cho rằng đây cũng là vì nó là một thủ tục lưu trữ mở rộng.


1
Như Aaron nói, việc đọc và gỡ lỗi một thủ tục được lưu trữ có tham số được chỉ định theo tên sẽ dễ dàng hơn. Đây là một trong những tính năng yêu thích của tôi về T-SQL. Thật là một sự xấu hổ tính năng này bị phá vỡ cho các thủ tục lưu trữ mở rộng! Có lẽ đây là một lý do khiến các thủ tục lưu trữ mở rộng thường không được chấp nhận .
Iain Samuel McLean Elder

0

Điều này hoạt động với tôi: nếu bạn chỉ định @maxfiles, bạn phải sử dụng tùy chọn 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
...

Với tùy chọn này (2) không có lỗi khi tạo dấu vết

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.