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

Přidejte sloupec do tabulky a poté jej aktualizujte v rámci transakce

GO není příkaz T-SQL. Je oddělovač šarže. Klientský nástroj (SSM, sqlcmd, osql atd.) jej používá k efektivnímu řezání soubor na každém GO a odeslat na server jednotlivé dávky. Takže samozřejmě nemůžete použít GO uvnitř IF, ani nemůžete očekávat, že proměnné budou pokrývat rozsah napříč dávkami.

Také nemůžete zachytit výjimky bez kontroly XACT_STATE() aby transakce nebyla odsouzena k zániku.

Použití GUID pro ID je vždy přinejmenším podezřelé.

Použití omezení NOT NULL a poskytnutí výchozího „guid“ jako '{00000000-0000-0000-0000-000000000000}' také nemůže být správné.

Aktualizováno:

  • Rozdělte ALTER a UPDATE do dvou dávek.
  • K přerušení skriptu při chybě použijte rozšíření sqlcmd. Toto je podporováno SSMS, když je zapnutý režim sqlcmd , sqlcmd a je triviální, aby jej podporovaly i klientské knihovny:dbutilsqlcmd .
  • použijte XACT_ABORT vynutit chybu k přerušení dávky. To se často používá ve skriptech údržby (změny schématu). Uložené procedury a skripty aplikační logiky obecně místo toho používají bloky TRY-CATCH, ale s náležitou péčí:Zpracování výjimek a vnořené transakce .

příklad skriptu:

:on error exit

set xact_abort on;
go

begin transaction;
go

if columnproperty(object_id('Code'), 'ColorId', 'AllowsNull') is null
begin
    alter table Code add ColorId uniqueidentifier null;
end
go

update Code 
  set ColorId = '...'
  where ...
go

commit;
go

Pouze úspěšný skript dosáhne COMMIT . Jakákoli chyba přeruší skript a vrátí zpět.

Použil jsem COLUMNPROPERTY pro kontrolu existence sloupce můžete místo toho použít jakoukoli metodu, kterou chcete (např. lookup sys.columns ).



  1. Doctrine2 ORM vyberte pro aktualizaci

  2. Výsledek SQLAlchemy pro sloupec UTF-8 je typu 'str', proč?

  3. Vložte hodnoty ze dvou tabulek do jedné tabulky

  4. Zrychlení (pomalé) obrovské databáze wordpress