2010-07-08 35 views
5

Veritabanlarımızın ikisini birleştirmek için çok sayıda SQL Server 2005 betiğini uyarlıyorum. Komut dosyaları, komut dosyalarını sırayla çalıştırmak için sqlcmd'yi çağıran bir .cmd dosyasından çalıştırılır. Ancak, komut dosyalarının başarısız olduğu bir veya iki sorun yaşıyorum.SQL Server için Debug.Assert Eşdeğeri

Yanlış yazılmış bazı komut dosyalarının durumuna göz atmanın hızlı bir yolunu bulmak istiyorum - değişken değerleri, bazı sorguların sonuçlarını ve benzeri şeyleri kontrol edin.

Bir .NET derlemesinde bu sorunla karşılaşıyor olsaydım, kodu Debug.Assert ile artırır veya başarısızlıkların gerçekleşeceğini bildiğim kesme noktaları belirledim, bu da program yürütmeyi duraklatır ve değişkeni denetlememe izin verir değerler.

Merak ediyorum, SQL Server 2005'te bir eşdeğer var mı?

cevap

7

ben de SQL Server ile entegre ayıklama çalışması için başaramadık - Ben genellikle kullanarak, "printf" ayıklama çare PRINT veya RAISERROR ifadeleri. RAISERROR, değerleri mesaj penceresine tükürmek için bazı temel argüman formatlamalarını yapabilir. Örneğin. Eğer VAL1 @ bir parametre varsa, int türünde, yapabileceğiniz:

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

+0

Bekleme seçeneği hakkında hiçbir şey bilmiyordum – JasonHorner

0

Ben toplu iş dosyaları kullanma ve bunun gibi hata kodunu kontrol: -

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

IF ERRORLEVEL 1 (
    ECHO. Failed. 
) ELSE (
    ECHO. Succeeded. 
) 
1
(İLE NOWAIT seçeneği yerine tamponlama mesajları/çıkışların normal bir SQL davranışlarına göre, hemen görünmesini mesajı neden olur)

Bu, aşağıdaki gibi çalışır:

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