sql >> Database >  >> RDS >> Sqlserver

T-SQL kon niet terugdraaien

Ik denk dat je niets kunt doen aan de behandeling van Sql Server met de behandeling van de ernst van de DDL-fout, een deel ervan wordt automatisch afgehandeld (bijvoorbeeld het gedwongen terugdraaien van een transactie) door Sql Server zelf.

Wat u gewoon kunt doen, is uw scriptcode er omheen maken en scriptgebruikers voorzien van beschrijvende fouten.

Een voorbeeld:

--  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. Mocha-testen van PostgreSQL met Knex geeft me een MigrationLocked-fout

  2. MySQL - Is het mogelijk om LIKE op alle kolommen in een tabel te gebruiken?

  3. Hoe id met max datumgroep per categorie selecteren in Ecto-query met Phoenix?

  4. '01-sep-2017' omzetten naar '01/09/2017' in T-SQL?