sql >> Databáze >  >> RDS >> Sqlserver

T-SQL se nepodařilo vrátit zpět

Myslím, že s ošetřením SQL Serveru se zpracováním závažnosti chyb DDL nemůžete nic dělat, některé z nich jsou zpracovány automaticky (například nuceným vrácením transakce) samotným Sql Serverem.

Jediné, co můžete udělat, je zajistit, aby se kód skriptu vypořádal s tím a poskytnout uživatelům skriptu popisnou chybu.

Příklad:

--  drop table thetransformersmorethanmeetstheeye
--  select * from thetransformersmorethanmeetstheeye



--  first batch begins here         

    begin tran

    create table thetransformersmorethanmeetstheeye(i int); -- non-erring if not yet existing

    -- even there's an error here, @@ERROR will be 0 on next batch
    ALTER TABLE [dbo].[Table1]  WITH CHECK ADD  CONSTRAINT [FK_constraint] FOREIGN KEY([field1], [field2])
    REFERENCES [dbo].[Table2] ([field3], [field4]);             

go  -- first batch ends here



--  second batch begins here

    if @@TRANCOUNT > 0 begin        
        PRINT 'I have a control here if things needed be committed or rolled back';

        -- @@ERROR is always zero here, even there's an error before the GO batch. 
        -- @@ERROR cannot span two batches, it's always gets reset to zero on next batch
        PRINT @@ERROR; 


        -- But you can choose whether to COMMIT or ROLLBACK non-erring things here
        -- COMMIT TRAN;
        -- ROLLBACK TRAN;

    end
    else if @@TRANCOUNT = 0 begin
        PRINT 'Sql Server automatically rollback the transaction. Nothing can do about it';
    end
    else begin
        PRINT 'Anomaly occured, @@TRANCOUNT cannot be -1, report this to Microsoft!';
    end

--  second batch implicitly ends here   


  1. Citování názvů sloupců pomocí NHibernate a PostgreSQL

  2. Jak rozložit průměr mezi dva intervaly v orákulu

  3. Hledání celého jména nebo jména nebo příjmení v databázi MySQL se jménem a příjmením v samostatných sloupcích

  4. Vertikální škálování PostgreSQL