如何解决;关键字';视图';在动态SQL中创建视图时出错

如何解决;关键字';视图';在动态SQL中创建视图时出错,sql,sql-server,dynamic-sql,create-view,Sql,Sql Server,Dynamic Sql,Create View,我有一个用例,需要使用动态SQL在多个数据库中创建视图。我意识到在动态SQL中不能在视图前面给出数据库名称,所以在动态SQL的开头使用了usedatabase语句。我在关键字“VIEW”错误附近得到了不正确的语法。我想知道它是否与动态SQL中的CREATEVIEW语句有关?有什么建议会有帮助吗 SET @Sql = N' USE ' + @DbName + ' IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES

我有一个用例,需要使用动态SQL在多个数据库中创建视图。我意识到在动态SQL中不能在视图前面给出数据库名称,所以在动态SQL的开头使用了
use
database语句。我在关键字“VIEW”错误附近得到了不正确的语法。我想知道它是否与动态SQL中的CREATEVIEW语句有关?有什么建议会有帮助吗

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 )
从文档:

评论


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

由于
CREATE VIEW
必须是查询批处理中的第一条语句,因此您需要将代码分成两部分,并分别运行它们。这就是SSMS在
USE db
之后添加
GO
命令的原因

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

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

USE db; 
-- some logic determining if the second command should run
EXEC 'CREATE VIEW AS ...'
第二个命令只有
创建视图
语句。

来自文档:

评论


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

由于
CREATE VIEW
必须是查询批处理中的第一条语句,因此您需要将代码分成两部分,并分别运行它们。这就是SSMS在
USE db
之后添加
GO
命令的原因

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

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

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

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

您发布的动态SQL甚至无效。。。将其复制到查询窗口并进行检查。对我们来说,当它一开始是无效的时候,我们很难提供帮助。在你的例子中没有“去”的迹象。我猜你打了两次电话给exec,这似乎是不必要的<代码>打印(@Sql)
而不是执行它,然后查看它是否有效。根据文档,在引用链接服务器时,您只能使用
AT
,而您似乎没有这样做。谢谢,我应该放在哪里?不。。。正如我所说,你的代码甚至没有通过语法检查。。。所以它不可能是你真正使用的。而位于
仅适用于链接服务器。无论哪种方式,此代码都不起作用。不能嵌套创建这样的视图。尝试在不使用动态SQL的情况下运行单个测试的代码,在尝试将其转换为动态SQL之前,请确保该代码有效。您发布的动态SQL甚至无效。。。将其复制到查询窗口并进行检查。对我们来说,当它一开始是无效的时候,我们很难提供帮助。在你的例子中没有“去”的迹象。我猜你打了两次电话给exec,这似乎是不必要的<代码>打印(@Sql)
而不是执行它,然后查看它是否有效。根据文档,在引用链接服务器时,您只能使用
AT
,而您似乎没有这样做。谢谢,我应该放在哪里?不。。。正如我所说,你的代码甚至没有通过语法检查。。。所以它不可能是你真正使用的。而位于的
仅适用于链接服务器。无论哪种方式,此代码都不起作用。不能嵌套创建这样的视图。尝试在不使用动态SQL的情况下为单个测试运行代码,在尝试将其转换为动态SQL之前,请确保该操作正常。谢谢,我同意。这就是问题所在,但在创建视图之前,我有一个条件来检查该数据库中是否存在该表。不确定如何实现这一点。谢谢,我同意。这就是问题所在,但我有一个条件,在创建视图之前检查该数据库中是否存在该表。不确定如何实现这一点