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?

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)

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)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.