使用动态Sql创建视图

Mar*_*ker 9 t-sql sql-server dynamic-sql

我正在尝试创建一个动态数据库创建脚本.

有很多步骤,我们经常创建这个数据库,所以脚本看起来像这样.

 DECLARE @databaseName nvarchar(100) = 'DatabaseName'
 EXEC('/*A lot of database creation code built off of @databaseName*/')
Run Code Online (Sandbox Code Playgroud)

除了我们在此数据库中创建的一个视图外,这一切都很好.

我理解的问题源于SQL中关于EXEC命令的三个规则

  1. 使用环境只对EXEC的生命有效
  2. 'CREATE VIEW'必须是查询批处理中的第一个语句
  3. GO实际上不是SQL命令,因此在动态sql中不允许这样做
  4. 在CREATE VIEW上,您只能指定为Schema.

所以这里有三件我尝试过但没有成功的事情.

--Result: Error message, "'CREATE VIEW' must be the first statement in a query batch"
EXEC 
('
    USE [' + @databaseName + ']
    CREATE VIEW
')
Run Code Online (Sandbox Code Playgroud)

有什么建议?我认为这应该是一个常见的用例,但谷歌无法帮助我.

Dav*_*haw 14

您可以通过双重嵌套动态SQL语句来执行此操作:

begin tran
declare @sql nvarchar(max) = 
    N'use [AdventureWorks2012]; 
      exec (''create view Test as select * from sys.databases'')';

exec (@sql);

select * from AdventureWorks2012.sys.views
where name = 'Test'

rollback tran
Run Code Online (Sandbox Code Playgroud)