Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Добавете колона към таблицата и след това я актуализирайте в транзакцията

GO не е T-SQL команда. Е пакетен разделител. Клиентският инструмент (SSM, sqlcmd, osql и т.н.) го използва за ефективно изрязване файла на всеки GO и изпращане на сървъра на отделните партиди. Така че очевидно не можете да използвате GO вътре в IF, нито можете да очаквате променливите да обхващат обхват в партиди.

Освен това не можете да уловите изключения, без да проверите за XACT_STATE() за да се гарантира, че транзакцията не е обречена.

Използването на GUID за ID винаги е най-малкото подозрително.

Използване на ограничения NOT NULL и предоставяне на „guid“ по подразбиране като '{00000000-0000-0000-0000-000000000000}' също не може да бъде правилно.

Актуализирано:

  • Разделете ALTER и UPDATE на две групи.
  • Използвайте разширения sqlcmd, за да прекъснете скрипта при грешка. Това се поддържа от SSMS, когато режимът sqlcmd е включен , sqlcmd и е тривиално да се поддържа и в клиентски библиотеки:dbutilsqlcmd .
  • използвайте XACT_ABORT за принудителна грешка за прекъсване на партидата. Това често се използва в скриптове за поддръжка (промени в схемата). Съхранените процедури и логическите скриптове на приложения като цяло използват TRY-CATCH блокове вместо това, но с подходяща грижа:Обработка на изключения и вложени транзакции .

примерен скрипт:

: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

Само успешен скрипт ще достигне до COMMIT . Всяка грешка ще прекъсне скрипта и ще върне назад.

Използвах COLUMNPROPERTY за да проверите за съществуване на колона, можете да използвате всеки метод, който желаете вместо това (напр. търсене sys.columns ).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възможно ли е да се съхрани стойността на една колона за избор и да се използва за следващата?

  2. Как да заредите отново идентичност на таблица в SQL Server 2008 и да отмените всичко безопасно?

  3. Топ 5 функции, които вашата платформа за мониторинг на ефективността на базата данни на SQL Server трябва да предостави

  4. Какво е DTU в Azure SQL база данни и как да разберем колко ни трябва

  5. Функции срещу съхранени процедури