【发布时间】:2014-02-06 01:04:11
【问题描述】:
我正在尝试创建一个动态数据库创建脚本。
有很多步骤,我们经常创建这个数据库,所以脚本看起来像这样。
DECLARE @databaseName nvarchar(100) = 'DatabaseName'
EXEC('/*A lot of database creation code built off of @databaseName*/')
这一切都很好,除了我们想在@databaseName 中创建一个视图。
我尝试了四种不同的方法来创建此视图,但均未成功:
-
我的第一个想法是简单地设置数据库上下文,然后在一个脚本中创建视图。不幸的是,这不起作用,因为
CREATE VIEW必须是其查询块中的第一条语句 (details)。--Result: Error message, "'CREATE VIEW' must be the first statement in a query batch" EXEC (' USE [' + @databaseName + '] CREATE VIEW ') -
为了绕过 (1) 我尝试单独设置上下文,以便
CREATE VIEW将成为EXEC中的第一个命令。这确实创建了视图,但在我当前的上下文中创建了视图,而不是@databaseName。在EXEC中调用USE的效果似乎只持续到EXEC语句(details)结束。--Result: The view is created in the currently active database rather than @databaseName EXEC ('USE [' + @databaseName + ']') EXEC ('CREATE VIEW') -
接下来,我尝试将所有内容放回一个脚本中,但包含了一个
GO命令,以便使CREATE VIEW成为新查询块中的第一个命令。这失败了,因为在EXEC脚本 (details) 中不允许使用GO。--Result: Error message, "Incorrect syntax near 'GO'" EXEC (' USE [' + @databaseName + '] GO CREATE VIEW ') -
最后我尝试将目标数据库指定为
CREATE VIEW命令的一部分。在这种情况下,脚本失败了,因为CREATE VIEW不允许将数据库指定为其创建的一部分 (details)。--Result: Error message, "'CREATE/ALTER VIEW' does not allow specifying the database name as a prefix to the object name" EXEC ('CREATE VIEW [' + @databaseName + '].[dbo].[ViewName]')
有什么建议吗?我认为这应该是一个常见的用例,但 Google 无法帮助我。
【问题讨论】:
标签: sql-server tsql dynamic-sql