【问题标题】:Executing CREATE VIEW & ALTER VIEW from SQLCMD从 SQLCMD 执行 CREATE VIEW 和 ALTER VIEW
【发布时间】:2012-05-05 21:49:12
【问题描述】:

我正在尝试使用 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 语句时,脚本执行得很好。

谢谢!

【问题讨论】:

    标签: tsql sqlcmd


    【解决方案1】:

    按照说明书:

    CREATE VIEW 必须是查询批处理中的第一条语句。

    虽然说实话,该语句相当具有误导性,因为实际上CREATE VIEW 必须是批处理中的唯一语句,正如您可以从这个插图中自己确定的那样非常简单的测试:

    Messages 窗格中的错误消息显示 Incorrect syntax near keyword 'SELECT',但如果您将鼠标悬停在带下划线的 CREATE VIEW 语句上,则会出现一条提示消息,表明您不能在 @ 之前放置任何内容987654325@ 也不在其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     
    …
    

    【讨论】:

    • ...除非您将 DDL 包含在动态 SQL 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2011-04-10
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多