执行CREATE VIEW&来自SQLCMD的ALTER VIEW

时间:2012-05-05 21:49:13

标签: tsql sqlcmd

我正在尝试使用sql cmd执行包含以下内容的sql文件。

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语句时,脚本执行得很好。

谢谢!

1 个答案:

答案 0 :(得分:6)

根据手册:

  

CREATE VIEW必须是查询批次中的第一个语句。

虽然,说实话,这个陈述是相当误导的,因为事实上CREATE VIEW必须是批次中的唯一陈述,因为你可以从这个例子中找出你自己一个非常简单的测试:

CREATE VIEW issue illustration

消息窗格中的错误消息显示Incorrect syntax near keyword 'SELECT',但如果将鼠标悬停在强调的CREATE VIEW语句上,则会显示一条提示消息,显示您无法放置任何既不在CREATE VIEW之前也不在SELECT之后的任何事情。

ALTER VIEW完全相同。

因此,您可以在事务中执行CREATE VIEW和/或ALTER VIEW个语句(通过使用GO个关键字分隔它们) ,但您将无法使用BEGIN TRY ... BEGIN CATCH来捕获这些语句引发的异常。

除非Aaron 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     
…