首页 > 解决方案 > 如何解决“在动态 SQL 中创建视图时,关键字 'VIEW' 附近的语法错误”

问题描述

我有一个用例,我需要使用动态 SQL 在多个数据库中创建视图。意识到动态SQL中不能在视图前面给出数据库名,所以在动态SQLuse的开头使用了数据库语句。我在关键字“VIEW”错误附近收到不正确的语法。我想知道它是否与动态 SQL 中的 create view 语句有关?任何指示都会有帮助吗?

SET @Sql = N'

USE ' + @DbName + '

IF (EXISTS (SELECT * 
             FROM INFORMATION_SCHEMA.TABLES 
             WHERE TABLE_SCHEMA = ''DBO'' 
             AND  TABLE_NAME = ''TAB_1''))
BEGIN

    IF OBJECT_ID(''[dbo].[VW_1]'') is not null
      DROP VIEW [dbo].[VW_1]
    
    CREATE VIEW [dbo].[VW_1]
    AS
    SELECT 
    ...
    ...

END


SET @Sql = 'EXEC (''' + REPLACE(@Sql, '''', '''''') + ''')' + CASE WHEN @ServerName = @ThisServer THEN '' ELSE ' AT ' + @ServerName END
EXEC ( @Sql )

标签: sqlsql-serverdynamic-sqlcreate-view

解决方案


来自CREATE VIEW文档:

评论


只能在当前数据库中创建视图。CREATE VIEW 必须是查询批处理中的第一条语句。

由于CREATE VIEWmust 是查询批处理中的第一条语句,因此您需要将代码分成两部分并以某种方式分别运行它们。这就是 SSMSGOUSE db.

我不知道如何在动态 SQL 中实现这一点。

也许,构建两个动态 SQL 命令。第一个命令将有

USE db; 
-- some logic determining if the second command should run
EXEC 'CREATE VIEW AS ...'

第二个命令将只有CREATE VIEW语句。


推荐阅读