2013-03-14 46 views
21

Tôi đang cố gắng gỡ lỗi các thủ tục được lưu trữ trong SQL Server Management Studio 2008. Tôi muốn chèn một số lệnh in để kiểm tra một số câu lệnh IF mà tôi biết là sai.Làm cách nào để gỡ lỗi các thủ tục đã lưu bằng lệnh in?

Để gỡ lỗi, tôi đã thử sử dụng lệnh PRINT '5'.

Tôi đã thử sử dụng RAISERROR như 'RAISERROR (N'Start',10,1) WITH NOWAIT'.

Nhưng chúng không hiển thị bất kỳ bản in nào, chỉ có tập hợp kết quả. Thông báo chỉ cho biết 1 row affected.

Tôi đã cố gắng để viết mã như vậy (có lẽ đây là một cách tiếp cận không chính xác):

SET NOCOUNT ON   
RAISERROR (N'Start',10,1) WITH NOWAIT  
DECLARE @DocHandle INT   
DECLARE @PageSize INT, @PageIndex INT, @TOTL_CONT NUMERIC(5,0), @Paging BIT   
DECLARE @Type INT, @Search varchar(20) , @ORDE nVARCHAR(50), @SORT_ID nVARCHAR(50) 
DECLARE @CreatedOn varchar(25), @SystemGenerate bit 

cách tốt nhất để sử dụng báo cáo in để gỡ lỗi một thủ tục lưu trữ là gì?

+1

Bạn có thể chỉ cho chúng ta câu lệnh if? Nếu nó không in, thì có lẽ thử nghiệm thất bại và nó không đi vào khối điều kiện. – Bridge

+0

Có phải '1 hàng bị ảnh hưởng' khi bạn cập nhật thủ tục đã lưu trữ của mình hay khi bạn thực sự thực thi nó? Không có lý do tại sao mã bạn đã đưa ra sẽ không in một cái gì đó (đến cửa sổ tin nhắn, không phải cho kết quả). –

Trả lời

17

Nếu bạn đang sử dụng MSSQL, các lệnh in phòng quản lý máy chủ sẽ in ra dưới tab thư không nằm trong tab Kết quả.

enter image description here

Báo cáo in sẽ xuất hiện ở đó.

+2

mm, như đã đề cập, điều duy nhất tôi thấy có '1 hàng bị ảnh hưởng'. –

+2

Bạn đã thử đặt một câu lệnh in làm dòng đầu tiên của quy trình chỉ để xem nó có in hay không. Có thể là các câu lệnh if không được nhập vào như bạn mong đợi. –

+0

Tôi có thể xác nhận rằng SQL Server Management Studio hiện tại không hiển thị các thông báo đó (Máy chủ chạy trên Đám mây của Amazon). –

10

thử sử dụng:

RAISERROR('your message here!!!',0,1) WITH NOWAIT 

bạn cũng có thể thử chuyển sang "Kết quả to Text" nó chỉ là một vài biểu tượng ở bên phải của "Execute" trên thanh công cụ mặc định.

Với cả hai cách trên, và bạn vẫn không thấy thông báo, hãy đảm bảo bạn đang chạy cùng một phiên bản máy chủ/cơ sở dữ liệu/chủ sở hữu của quy trình mà bạn đang chỉnh sửa. Hãy chắc chắn rằng bạn đang nhấn lệnh RAISERROR, làm cho nó là lệnh đầu tiên bên trong thủ tục.

Nếu vẫn thất bại, bạn có thể tạo ra một bảng:

create table temp_log (RowID int identity(1,1) primary key not null 
         , MessageValue varchar(255)) 

thì:

INSERT INTO temp_log VALUES ('Your message here') 

sau đó sau khi chạy thủ tục (với điều kiện không rollbacks) chỉ select bảng.

7

Dưới đây là ví dụ về sử dụng lệnh in. Chúng sẽ xuất hiện dưới tab tin nhắn như một người trước đó đã chỉ ra.

Declare @TestVar int = 5; 

    print 'this is a test message'; 
    print @TestVar; 
    print 'test-' + Convert(varchar(50), @TestVar); 

Print Messages

8

Trước khi tôi nhận được câu trả lời khẳng định của tôi; Tôi thú nhận rằng câu trả lời duy nhất tôi chấp nhận ở đây là số one bởi số KM. ở trên. Tôi đã bỏ phiếu cho các câu trả lời khác vì không ai trong số họ thực sự trả lời câu hỏi hoặc họ không thích hợp. Đầu ra PRINT thực sự xuất hiện trong cửa sổ Message, nhưng đó không phải là những gì được hỏi cả.

Tại sao đầu ra lệnh PRINT không hiển thị trong quá trình thực hiện Quy trình được lưu trữ của tôi?
Phiên bản ngắn của câu trả lời này là bạn đang gửi thực thi của sproc cho máy chủ SQL và nó sẽ không phản hồi cho đến khi nó kết thúc với toàn bộ giao dịch. Đây là câu trả lời hay hơn tại số external link này.

  • Đối với thậm chí nhiều ý kiến ​​/ quan sát tập trung chú ý của bạn về vấn đề này SO gửi here.
  • Cụ nhìn vào answer này của bài cùng bởi Phil_factor (Ha ha! Tình yêu và hài hước SQL)
  • Về đề nghị sử dụng RAISERROR VỚI NOWAIT nhìn vào answer này của bài cùng bởi JimCarden

Đừng làm những điều

  1. một số người có cảm tưởng rằng họ chỉ có thể sử dụng một tuyên bố GO sau khi tuyên bố PRINT của họ, nhưng bạn KHÔNG THỂ sử dụng câu lệnh GO INSIDE của một sproc. Vì vậy, giải pháp đó là ra ngoài.
  2. Tôi không khuyên bạn nên chọn các câu lệnh in của bạn vì nó chỉ sẽ lúng túng kết quả của bạn với vô nghĩa và nếu sproc của bạn được cho là được tiêu thụ bởi một chương trình sau đó, bạn sẽ phải biết kết quả nào bỏ qua khi lặp qua các kết quả từ trình đọc dữ liệu của bạn. Đây chỉ là một ý tưởng tồi, vì vậy đừng làm điều đó.
  3. Một vấn đề khác với SELECT-ING báo cáo in của bạn là chúng không luôn luôn hiển thị ngay lập tức. Tôi đã có những kinh nghiệm khác nhau với điều này cho các hành quyết khác nhau, vì vậy đừng mong đợi bất kỳ sự nhất quán nào với phương pháp này.

Thay thế cho IN bên trong một Stored Procedure
Thực sự điều này là loại một tác phẩm icky xung quanh theo ý kiến ​​của tôi, vì cú pháp là khó hiểu trong bối cảnh mà nó đang được sử dụng, nhưng ai mà biết được có thể nó sẽ được Microsoft cập nhật trong tương lai. Tôi chỉ không thích ý tưởng gây ra lỗi cho mục đích duy nhất là in ra thông tin gỡ lỗi ...

Dường như cách duy nhất xung quanh vấn đề này là sử dụng, như đã được giải thích nhiều lần đã RAISERROR WITH KHÔNG CHỜ ĐỢI. Tôi cung cấp một ví dụ và chỉ ra một vấn đề nhỏ với cách tiếp cận này:

ALTER 
--CREATE 
    PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- This will print immediately 
    RAISERROR ('RE Start', 0, 1) WITH NOWAIT 
    SELECT 1; 

    -- Five second delay to simulate lengthy execution 
    WAITFOR DELAY '00:00:05' 

    -- This will print after the five second delay 
    RAISERROR ('RE End', 0, 1) WITH NOWAIT 
    SELECT 2; 
END 

GO 

EXEC [dbo].[PrintVsRaiseErrorSprocExample] 

Cả hai kết quả câu lệnh SELECT sẽ chỉ hiển thị sau khi thực hiện xong và in báo cáo sẽ hiển thị theo thứ tự hiển thị ở trên.

vấn đề tiềm năng với cách tiếp cận này
Hãy nói rằng bạn có cả hai tuyên bố IN của bạn và RAISERROR tuyên bố một sau khi khác, sau đó cả hai đều in. Tôi chắc rằng điều này có liên quan đến việc lưu vào bộ đệm, nhưng hãy lưu ý rằng điều này có thể xảy ra.

ALTER 
--CREATE 
    PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample2] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- Both the PRINT and RAISERROR statements will show 
    PRINT 'P Start'; 
    RAISERROR ('RE Start', 0, 1) WITH NOWAIT 
    SELECT 1; 

    WAITFOR DELAY '00:00:05' 

    -- Both the PRINT and RAISERROR statements will show 
    PRINT 'P End' 
    RAISERROR ('RE End', 0, 1) WITH NOWAIT 
    SELECT 2; 
END 

GO 

EXEC [dbo].[PrintVsRaiseErrorSprocExample2] 

Vì vậy, công việc xung quanh đây là, không sử dụng cả PRINT và RAISERROR, chỉ cần chọn cái kia. Nếu bạn muốn đầu ra của bạn hiển thị trong khi thực hiện một sproc thì sử dụng RAISERROR WITH NOWAIT.

+1

Các liên kết bên ngoài không bị cau mày. Có một câu trả lời chỉ dựa vào các liên kết bên ngoài và không có bản chất nào bị cau mày. Nếu bạn cung cấp các liên kết bên ngoài để mọi người có thêm chi tiết, đó thực sự là một điều tốt. – mason

+0

Tôi nghe bạn và đó là cách tôi đã sử dụng chúng trong lịch sử, chỉ để được dinged hoặc đưa ra những lời chỉ trích của việc sử dụng một liên kết. Lý do thường là "Liên kết có thể chết" mà tôi thường trả lời "Tôi sẽ không ăn cắp tác phẩm của người khác." mà tôi đã thấy những người khác làm vì họ đang săn tìm điểm. Tôi không thích những lời bình luận đó, vì vậy tôi đã được ưu tiên về nó lần này. – dyslexicanaboko

+1

Bạn sẽ chỉ hợp lý nếu có ai đó phàn nàn nếu bạn sử dụng một liên kết bên ngoài và phần thân của câu trả lời không có đủ thông tin để trả lời câu hỏi. Nếu bạn có đủ thông tin trong câu hỏi của mình và chỉ sử dụng các liên kết bên ngoài làm phần bổ sung, bạn sẽ ổn thôi. Và nếu có ai than phiền, thì hãy nói với họ những gì tôi đã nói với bạn và đừng lo lắng về điều đó. Không cần phải xin lỗi trong câu trả lời của bạn cho bao gồm cả một liên kết bên ngoài. – mason

-1

Nhìn vào Howto này trong tài liệu MSDN: Run the Transact-SQL Debugger - đó là không với báo cáo IN, nhưng có lẽ nó giúp bạn anyway để gỡ lỗi mã của bạn.

Video trên YouTube này: SQL Server 2008 T-SQL Debugger cho biết việc sử dụng Trình gỡ lỗi.

=> Các thủ tục được lưu trữ được viết bằng Transact-SQL. Điều này cho phép bạn gỡ lỗi tất cả các mã Transact-SQL và do đó, nó giống như gỡ lỗi trong Visual Studio với xác định các điểm ngắt và xem các biến.

Các vấn đề liên quan