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