2010-07-08 37 views
5

Tôi đang điều chỉnh một số lượng lớn các kịch bản SQL Server 2005 để kết hợp hai cơ sở dữ liệu của chúng ta với nhau. Các tập lệnh được chạy từ một tệp .cmd gọi sqlcmd để chạy các tập lệnh theo thứ tự. Tuy nhiên, tôi đang gặp một hoặc hai vấn đề trong đó các tập lệnh không thành công.Tương đương với Debug.Assert cho SQL Server

Tôi muốn một cách nhanh chóng để xem trạng thái của một số tập lệnh mà chúng không đúng - kiểm tra giá trị biến, kết quả của một số truy vấn, nội dung như vậy.

Nếu tôi gặp sự cố này với hội đồng .NET, tôi sẽ tăng mã bằng Debug.Assert hoặc đặt điểm ngắt nơi tôi biết lỗi sẽ xảy ra, điều này sẽ tạm dừng thực thi chương trình và cho phép tôi kiểm tra biến giá trị.

Tôi đã tự hỏi, liệu có tương đương với SQL Server 2005 không?

Trả lời

7

Tôi chưa bao giờ được quản lý để thực hiện việc gỡ lỗi tích hợp tốt với SQL Server - Tôi thường dùng đến "printf" gỡ rối, sử dụng hoặc là câu hỏi PRINT hoặc RAISERROR. RAISERROR có thể thực hiện một số định dạng đối số cơ bản, để nhổ các giá trị ra ngoài cửa sổ tin nhắn. Ví dụ. nếu bạn có một tham số @ VAL1, kiểu int, bạn có thể làm:

RAISERROR('Val1 = %i',10,1,@Val1) WITH NOWAIT 

(tùy chọn WITH NOWAIT gây ra thông báo xuất hiện ngay lập tức, chứ không phải là hành vi SQL thông thường của bộ đệm tin nhắn/đầu ra)

+0

Không biết về tùy chọn không chờ đợi để bao gồm – JasonHorner

0

tôi sử dụng các tập tin batch và kiểm tra mã lỗi như thế này: -

SQLCMD.EXE -b -l 30 -E -S <SERVER> -i "<SQLFILE>.sql">>"%LOG_FILE%"2>&1 

IF ERRORLEVEL 1 (
    ECHO. Failed. 
) ELSE (
    ECHO. Succeeded. 
) 
1

Thao tác này sẽ hoạt động:

-- Assert procedure equivalent to other languages. 
-- raiserror() will cause sql execution to stop and throw execep in C# code that is running this statement. 
-- Usage: 
-- declare @shouldBeTrue bit 
-- set @shouldBeTrue = case when 1=0 then 1 else 0 end 
-- exec _AT3Assert @shouldBeTrue, 'failed' 
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = '_AT3Assert' AND ROUTINE_SCHEMA = 'dbo' AND ROUTINE_TYPE = 'PROCEDURE') 
EXEC ('DROP PROCEDURE dbo._AT3Assert') 
GO 
create procedure dbo._AT3Assert 
    @shouldBeTrue bit,  
    @errorMsg nvarchar (max) 
AS 
    SET NOCOUNT ON; 
    if @shouldBeTrue is null or @shouldBeTrue <> 1 
    begin 
     raiserror (@errorMsg, -- Message text. 
       11, -- Severity. 
       1 -- State. 
       ); 
    end 
GO 
Các vấn đề liên quan