sql - 如何解决“在动态 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 )
解决方案
来自CREATE VIEW
文档:
评论
只能在当前数据库中创建视图。CREATE VIEW 必须是查询批处理中的第一条语句。
由于CREATE VIEW
must 是查询批处理中的第一条语句,因此您需要将代码分成两部分并以某种方式分别运行它们。这就是 SSMSGO
在USE db
.
我不知道如何在动态 SQL 中实现这一点。
也许,构建两个动态 SQL 命令。第一个命令将有
USE db;
-- some logic determining if the second command should run
EXEC 'CREATE VIEW AS ...'
第二个命令将只有CREATE VIEW
语句。
推荐阅读
- angular - 使用 environment.ts 文件保护 AWS 配置详细信息的安全性
- amazon-eks - 从 Azure DevOps 部署到 EKS
- python - 列表中的列表 BeautifulSoup 未关闭
- 提取问题
- cmake - 在不假设 vcpkg 存在的情况下,克隆 repo 并运行 CMake+vcpkg 项目的一步过程是什么?
- kubernetes - Kube-Proxy-Windows CrashLoopBackOff
- angular - 如何将剑道网格导出到带有过滤数据的excel文件
- flutter - 如何验证表单域
- python - 不满足 Numpy FFT 的 Parseval 定理
- javascript - 如何使用 React js 获取 api 数据
- django - Django Channels 3.0 - 用于不同 websocket 路由的不同中间件