動的SQLを使用して指定されたデータベースにビューを作成しますか?


16

別のデータベースにビューをドロップして作成するための動的SQLを作成しています。

だから私は書いた:

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

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

それは私にエラーを与えます:

「CREATE VIEW」は、クエリバッチの最初のステートメントである必要があります。

USE DATABASEステートメントを削除すると正常に機能しますが、データベースは指定されなくなります。

この問題を解決するにはどうすればよいですか?

回答:


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もちろんです:)
キングチャン

間違いなく働いた!! 私はそれを使用しましたが、ネストされたクエリ内の多くの変数で、引用処理の頭痛の種でした!しかし素晴らしい解決策!

あなたはヒーローです。私の最初の子供にあなたにちなんで名前を付けます。
イェンス

-1

このケースに遭遇したときに私が処理した1つの方法は、useステートメントの後にGOを配置することです。

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

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

ご存知のように、GO statmentはexecで実行されません
キングチャン

2
これは、動的SQLのコンテキストでは機能しません。GOクライアントツールのバッチ区切り文字はTSQLキーワードではありません。
マーティンスミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.