2010-08-18 9 views
7

nasıl kullanılır Saklı yordam yazıyor ve bir şey başarısız olduğunda 0 kayıt dönmek istiyorum. 0 satırları nasıl döndüreceğimi anlayamıyorum. Ben SELECT NULL kullandım ama bu satır 1 col 1 NULL ile 1 satır döndürür. Ayrıca benim hata kodu yolunda herhangi bir SELECT deyimleri belirterek denedim ama SP çağrısı sonra @@ROWCOUNT değerini test ederken, geri döndü 1 Bunun nedeni, @@ROWCOUNT'un SP'de daha önce (EXISTS()) SELECT ifadesinden hiçbir zaman sıfırlanamaması olabilir. Herhangi bir tavsiye takdir edilecektir.T-SQL: Saklı yordamından 0 satır nasıl döndürülür ve XACT_ABORT ve TRY/CATCH

Ayrıca, AÇIK olarak ayarlanmış XACT_ABORT var, ancak saklı yordamından "dönüş değeri" doğru hata döndürdüğünden emin olmak için bir TRY/CATCH bloğu kullandım. Bu iyi mi? Bir hata varsa, XACT_ABORTTRY/CATCH'u geçersiz kılar mı yoksa hata kod yolum hala doğru döndürülen değerlerin döndürülmesine neden olur mu? 0 satırları döndürmek için

-- Setup 
SET NOCOUNT ON; -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements. 
SET XACT_ABORT ON; -- SET XACT_ABORT ON rollback transactions on errors 
DECLARE @return int; SET @return = 1; -- Default to general error 

-- Start transaction 
BEGIN TRANSACTION 
    BEGIN TRY 

     IF NOT EXISTS(SELECT NULL FROM [MyTable] WHERE [Check] = 1) 
     BEGIN 

      -- Insert new record  
      INSERT INTO [MyTable] (Check, Date) VALUES (1, GETDATE()); 
      SELECT SCOPE_IDENTITY() AS [MyValue]; -- Return 1 row 
      SET @return = 0; -- Success 

     END 
     ELSE 
     BEGIN 

      -- Fail 
      SELECT NULL AS [MyValue]; -- Want to return 0 rows not 1 row with NULL 
      SET @return = 2; -- Fail error 

     END 

    END TRY 
    BEGIN CATCH 

     -- Error 
     ROLLBACK TRANSACTION; 
     SELECT NULL AS [MyValue]; -- Want to return 0 rows not 1 row with NULL 
     SET @return = 1; -- General error 

    END CATCH 

-- End transaction and return 
COMMIT TRANSACTION 
RETURN @return; 

cevap

12

, yapabileceğiniz: Şahsen

SELECT TOP 0 NULL AS MyValue 

, ben bir resultset dönen dışarı yerine geri kimliğini dönmek için bu sproc için bir OUTPUT parametresi kullanmayı tercih ediyorum - bu sadece benim tercih olsa da. Sonra sadece çıkış parametresini ör. Hiçbir şey yapılmadığını belirtmek için varsayılan olarak -1.

+0

teşekkürler! Bundan 0 sonuç çıkıyorum :) Ama EXEC MySP'den sonra neden @@ ROWCOUNT = 1? –

+0

'EXEC @ret = MySP; SET @rows = @@ ROWCOUNT; SELECT 'Satırlar' = @ satırlar 1, sonra satır sayısı olarak 1 döndürür !? –

+0

Ah, @@ ROWCOUNT'un sadece satırları etkileyen ifadeler (yani, INSERT veya UPDATE) için değiştirilmesinde haklıyım mı? –

1

bu yapardım nasıl: Hızlı cevap için

CREATE PROCEDURE YourProcedure 
AS 
( @NewMyValue int OUTPUT --<<<<<use output parameter and not a result set 
) 
BEGIN TRY 

    --<<<<put everything in the BEGIN TRY!!! 

    -- Setup 
    SET NOCOUNT ON; -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements. 
    SET XACT_ABORT ON; -- SET XACT_ABORT ON rollback transactions on errors 
    DECLARE @return int 

    --<<init multiple variables in a select, it is faster than multiple SETs 
    --set defaults 
    SELECT @return = 1  -- Default to general error 
      ,@NewMyValue=NULL 

    -- Start transaction 
    BEGIN TRANSACTION --<<<put the transaction in the BEGIN TRY 

    --<<<lock rows for this transaction using UPDLOCK & HOLDLOCK hints 
    IF NOT EXISTS(SELECT NULL FROM [MyTable] WITH (UPDLOCK, HOLDLOCK) WHERE [Check] = 1) 
    BEGIN 
      -- Insert new record  
     INSERT INTO [MyTable] (Check, Date) VALUES (1, GETDATE()); 
     SELECT @NewMyValue=SCOPE_IDENTITY() --<<<set output parameter, no result set 
       ,@return = 0; -- Success 
    END 
    ELSE 
    BEGIN 
     -- Fail 
     --<<no need for a result set!!! output parameter was set to a default of NULL 
     SET @return = 2; -- Fail error 
    END 

    COMMIT TRANSACTION --<<<commit in the BEGIN TRY!!! 
END TRY 
BEGIN CATCH 
    -- Error 
    IF XACT_STATE()!=0 --<<<only rollback if there is a bad transaction 
    BEGIN 
     ROLLBACK TRANSACTION 
    END 
    --<<any insert(s) into log tables, etc 
    --<<no need for a result set!!! output parameter was set to a default of NULL 
    SET @return = 1; -- General error 
END CATCH 

-- End transaction and return 
RETURN @return; 
GO 
İlgili konular