Créer une vue dans la base de données spécifiée avec SQL dynamique?

16

J'écris un SQL dynamique pour déposer et créer une vue dans une base de données différente.

J'ai donc écrit:

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

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

Cela me donne une erreur:

'CREATE VIEW' doit être la première instruction d'un lot de requêtes.

Si je supprime l'instruction USE DATABASE, cela fonctionne bien, mais la base de données n'est plus spécifiée ....

Comment puis-je résoudre ce problème?

King Chan
la source

Réponses:

25

Vous pouvez utiliser des EXECappels imbriqués . Le contexte de base de données modifié par le USEpersiste dans le lot enfant.

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)
Martin Smith
la source
1
+1 - Si vous scriptez des vues à l'aide de SMO, c'est également ce que fait le framework - les définitions sont exécutées en SQL dynamique pour contourner la restriction
JNK
1
@KingChan - vous pouvez à la fois voter et accepter, FYI;)
JNK
@JNK +1 bien sûr ~ :)
King Chan
certainement travaillé !! bien que je l'utilise, avec de nombreuses variables à l'intérieur de la requête imbriquée, j'étais donc un casse-tête car la gestion des devis! bonne solution cependant!
Vous êtes un héros. Je nommerai mon premier-né après toi.
Jens
-1

Une façon que j'ai gérée lors de l'exécution dans ce cas est de placer GO après l'instruction use.

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

  SELECT ........something'
exec (@CreateViewStatement)
sgojgini
la source
Juste pour que vous sachiez, GO statment ne fonctionnera pas dans exec
King Chan
2
Cela ne fonctionnera pas dans le contexte du SQL dynamique. GOest un délimiteur par lots dans les outils client et non un mot clé TSQL.
Martin Smith