我正在尝试使用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语句时,脚本执行得很好。
谢谢!
答案 0 :(得分:6)
根据手册:
CREATE VIEW必须是查询批次中的第一个语句。
虽然,说实话,这个陈述是相当误导的,因为事实上CREATE VIEW
必须是批次中的唯一陈述,因为你可以从这个例子中找出你自己一个非常简单的测试:
消息窗格中的错误消息显示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
…