sql >> Database teknologi >  >> RDS >> Sqlserver

Tilføj kolonne til tabellen, og opdater den derefter i transaktionen

GO er ikke en T-SQL-kommando. Er en batch-afgrænser. Klientværktøjet (SSM, sqlcmd, osql osv.) bruger det til effektivt at klippe filen ved hver GO og send de enkelte batches til serveren. Så du kan naturligvis ikke bruge GO inde i IF, og du kan heller ikke forvente, at variabler spænder over rækkevidde på tværs af batcher.

Du kan heller ikke fange undtagelser uden at tjekke efter XACT_STATE() for at sikre, at transaktionen ikke er dødsdømt.

Brug af GUID'er til ID'er er altid i det mindste mistænkeligt.

Brug af NOT NULL-begrænsninger og leverer en standard 'guide' som '{00000000-0000-0000-0000-000000000000}' kan heller ikke være korrekt.

Opdateret:

eksempel script:

: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

Kun et vellykket script vil nå COMMIT . Enhver fejl vil afbryde scriptet og rulle tilbage.

Jeg brugte COLUMNPROPERTY for at kontrollere, om kolonnen eksisterer, kan du bruge en hvilken som helst metode, du kan lide i stedet (f.eks. opslag sys.columns ).



  1. Simulering af MySQL's ORDER BY FIELD() i Postgresql

  2. Sådan bruges LIKE i SQL

  3. Fejlkode:1305. FUNKTION eller PROCEDURE eksisterer ikke

  4. Oracle:hvordan får man procent af totalen ved en forespørgsel?