使用动态SQL在指定的数据库中创建视图?


16

我正在写一个动态sql,以在不同的数据库中删除并创建视图。

所以我写道:

set @CreateViewStatement = 
                '
                USE ['+ @DB +'];
                CREATE VIEW [dbo].[MyTable]
                AS

                SELECT ........something
exec (@CreateViewStatement)

它给我错误:

“ CREATE VIEW”必须是查询批处理中的第一条语句。

如果我删除USE DATABASE语句,它可以正常工作,但是不再指定数据库了。

我怎么解决这个问题?

Answers:


25

您可以使用嵌套EXEC调用。由USE持久性更改的数据库上下文将保留到子批处理。

DECLARE @DB SYSNAME

SET @DB = 'tempdb'

DECLARE @CreateViewStatement NVARCHAR(MAX) 
SET @CreateViewStatement = '
      USE '+ QUOTENAME(@DB) +';
      EXEC(''
             CREATE VIEW [dbo].[MyTable] AS
             SELECT 1 AS [Foo]
      '')

                          '
EXEC (@CreateViewStatement)

1
+1-如果您使用SMO编写视图脚本,这也是框架的工作方式-在动态SQL中执行定义以解决限制
JNK

1
@KingChan-您既可以投票也可以接受,仅供参考;)
JNK

@JNK +1当然是〜:)
King Chan

绝对有效!尽管我使用了它,但是嵌套查询中有许多变量,所以我很讨厌报价处理!很好的解决方案!

你是英雄。会以你的名字命名我的长子。
詹斯(Jens)

-1

在遇到这种情况时,我已经处理的一种方法是将GO放在use语句之后。

set @CreateViewStatement = 
'
  USE ['+ @DB +']; GO
  CREATE VIEW [dbo].[MyTable]
  AS

  SELECT ........something'
exec (@CreateViewStatement)

请注意,GO陈述不会在执行程序中执行
King Chan

2
这在动态SQL的上下文中不起作用。GO是客户端工具中的批处理定界符,而不是TSQL关键字。
马丁·史密斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.