Еще одна ошибка в заявлении или эффект транзакции? - PullRequest
1 голос
/ 01 октября 2010

Я использую следующий код в SQL Server 2005.

BEGIN TRANSACTION;
CREATE TABLE dbo.MyTable
(
 idLang int NOT NULL IDENTITY (1, 1),
 codeLang nvarchar(4) NOT NULL
)  ON [PRIMARY];

IF @@ERROR = 0
 BEGIN
  PRINT 'before_commit';
  COMMIT TRANSACTION;
  PRINT 'after_commit';
 END
ELSE
 BEGIN
  PRINT 'before_rollback';
  ROLLBACK TRANSACTION;
  PRINT 'after_rollback';
 END
GO

1 - отображение, когда MyTable не существует (без ошибки):
before_commit
after_commit

=> OK

2 - Показать, когда MyTable существует (ошибка):
'В базе данных уже есть объект с именем' MyTable '.'

=> Почему не выполняется оператор else?(без печати, без отката)

Я знаю альтернативу try-catch, но я бы хотел понять этот странный случай ...

Спасибо!

Ответы [ 2 ]

1 голос
/ 01 октября 2010

CREATE TABLE будет проверен во время компиляции запроса и завершится ошибкой, поэтому ни один из кодов в пакете не будет выполнен. Попробуйте добавить:

SELECT @@TRANCOUNT

До конца сценария (т.е. после GO), и вы увидите, что НАЧАЛО СДЕЛКИ также никогда не происходило.

0 голосов
/ 01 октября 2010

Я не могу сказать конкретно, почему возникает ваша проблема.Лично я не уверен, что использовал бы для этого транзакцию и обработку ошибок или блок try / catch.

Вы пытались вместо этого запросить таблицу sys.tables, чтобы проверить ее существование.Что-то в этом роде:

IF EXISTS(SELECT * FROM sys.tables WHERE object_id = object_id('MyTable'))
BEGIN
 print 'table already exists'
END
ELSE
BEGIN
    CREATE TABLE dbo.MyTable
    (
        idLang int NOT NULL IDENTITY (1, 1),
        codeLang nvarchar(4) NOT NULL
    )  ON [PRIMARY];
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...