2015-03-18 2 views
1

Я использую SQL Server 2005 и SQL Server 2005 Management Studio Express. У меня есть сценарий с нижеприведенной схемой:Ошибка T-SQL: ALTER VIEW в блоке транзакции и try-catch

USE [MyDatabase] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

BEGIN TRANSACTION; 
GO 

BEGIN TRY 
    ALTER VIEW dbo.MyView 
    AS 
    SELECT ... 
    GO 
    ALTER TABLE ... 
    GO 
    UPDATE dbo.MyTable ... 
    GO 
    INSERT INTO dbo.AnotherTable ... 
    GO 
END TRY 
BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber 
     ,ERROR_SEVERITY() AS ErrorSeverity 
     ,ERROR_STATE() AS ErrorState 
     ,ERROR_PROCEDURE() AS ErrorProcedure 
     ,ERROR_LINE() AS ErrorLine 
     ,ERROR_MESSAGE() AS ErrorMessage; 

    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION; 
END CATCH; 

IF @@TRANCOUNT > 0 
    COMMIT TRANSACTION; 
GO 

Проблема заключается в том, что я получаю сообщение об ошибке в блоке ALTER VIEW dbo.MyView: «Неправильный синтаксис около зарезервированного слова„VIEW“.»

+2

Alter View должен быть единственным заявлением в партии. Он не может быть там. См. Объяснение здесь http://stackoverflow.com/questions/10466261/executing-create-view-alter-view-from-sqlcmd – sanmis

+0

@sanmis Ну, похоже, что с помощью операторов ALTER VIEW в качестве динамических запросов можно использовать либо EXEC (...) или EXEC sp_executesql. как объяснялось в конце сообщения, которое вы упомянули: http://stackoverflow.com/questions/10466261/executing-create-view-alter-view-from-sqlcmd Но теперь моя проблема заключается в том, что при включении моего альтернативного представления в качестве EXEC sp_executesql N'ALTER VIEW ... '; появляется другая ошибка: «Неверный синтаксис рядом»; ». – user1624552

ответ

1

Это не дало мне синтаксической ошибки, попробуйте это. Я просто удалил «Go» в конце динамического sql.

USE [MyDatabase] 
go 
SET ANSI_NULLS ON 
go 
SET QUOTED_IDENTIFIER ON 
go 
BEGIN TRANSACTION 
go 
BEGIN TRY 
EXEC sp_executesql N'ALTER VIEW dbo.MyView 
AS 
SELECT * FROM ....; ' 
EXEC sp_executesql N'ALTER TABLE ...;' 
EXEC sp_executesql N'UPDATE ....;' 
END TRY 
BEGIN CATCH 
SELECT 
    ERROR_NUMBER() AS ErrorNumber 
    ,ERROR_SEVERITY() AS ErrorSeverity 
    ,ERROR_STATE() AS ErrorState 
    ,ERROR_PROCEDURE() AS ErrorProcedure 
    ,ERROR_LINE() AS ErrorLine 
    ,ERROR_MESSAGE() AS ErrorMessage; 

IF @@TRANCOUNT > 0 
    ROLLBACK TRANSACTION; 
END CATCH; 
IF @@TRANCOUNT > 0 
COMMIT TRANSACTION; 
GO 
+0

Вы правы. Проблема была в операциях GO в блоке BEGIN TRY-END TRY. Удаление их теперь работает. Большое спасибо! – user1624552