如何解决;关键字';视图';在动态SQL中创建视图时出错
我有一个用例,需要使用动态SQL在多个数据库中创建视图。我意识到在动态SQL中不能在视图前面给出数据库名称,所以在动态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
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之前,请确保该操作正常。谢谢,我同意。这就是问题所在,但在创建视图之前,我有一个条件来检查该数据库中是否存在该表。不确定如何实现这一点。谢谢,我同意。这就是问题所在,但我有一个条件,在创建视图之前检查该数据库中是否存在该表。不确定如何实现这一点