2012-05-05 3 views
3

Я пытаюсь выполнить sql-файл со следующим содержимым, используя sql cmd.Выполнение CREATE VIEW & ALTER VIEW из SQLCMD

sqlcmd -S localhost\dbInstance -i Sample.sql -v filepath="C:\Sql\" 

Sample.sql содержание:

USE Sample_db 
GO 
BEGIN 
BEGIN TRANSACTION; 
    BEGIN TRY 
    CREATE VIEW [dbo].[Test_View] 
    AS SELECT * from Sample_table; 

    ALTER VIEW [dbo].[Sample_View] 
    AS SELECT * FROM table_9;   

    ALTER TABLE [Sample_Table_2] ADD Col_4 VARCHAR(20); 

    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; 

END 
GO 

Когда я исполняю SQLCMD, он выдает следующее сообщение об ошибке:

C:\Sql>sqlcmd -S localhost\dbInstance -i Sample.sql -v filepath="C:\Sql\" 
Changed database context to 'Sample_db'. 
Msg 156, Level 15, State 1, Server localhost\dbInstance, Line 5 
Incorrect syntax near the keyword 'VIEW'. 

Вопрос: Почему я не могу создать представление и изменить вид из sqlcmd, в то время как я могу изменить таблицу? Когда я комментирую инструкцию CREATE VIEW и ALTER VIEW, сценарий выполняется нормально.

Спасибо!

ответ

6

Согласно инструкции:

The CREATE VIEW must be the first statement in a query batch.

Хотя, честно говоря, это утверждение достаточно ввести в заблуждение, потому что на самом деле CREATE VIEW должен быть только заявление в пакете, как вы можете определить, для себя от этой иллюстрации очень простой тест:

CREATE VIEW issue illustration

сообщение об ошибке, в сообщения говорит Incorrect syntax near keyword 'SELECT', но если вы наводите верх над заявлением CREATE VIEW, появляется сообщение с подсказкой, которое показывает, что вы не можете положить ничего ни до CREATE VIEW, ни после его утверждения SELECT.

И это точно такая же проблема с ALTER VIEW.

Таким образом, вы можете иметь CREATE VIEW и/или ALTER VIEW заявления (s) осуществляет в рамках транзакции (по ограничивающим их GO ключевых слов), но вы не сможете использовать BEGIN TRY ... BEGIN CATCH для отлова исключений, сгенерированных теми заявления.

Если, как и Аарон Bertrand правильно напоминает мне, вы не выполнять эти заявления в качестве динамических запросов, используя либо EXEC(…) или EXEC sp_executesql …, что-то вроде этого, может быть:

… 
BEGIN TRY 
    EXEC sp_executesql N'CREATE VIEW [dbo].[Test_View] 
    AS SELECT * from Sample_table'; 

    EXEC sp_executesql N'ALTER VIEW [dbo].[Sample_View] 
    AS SELECT * FROM table_9';   

    ALTER TABLE [Sample_Table_2] ADD Col_4 VARCHAR(20); 

END TRY 
BEGIN CATCH  
… 
+2

... если вы не заключите DDL в динамическом SQL , –

+0

Правда, спасибо. Обновлен мой ответ. –