Creare la vista nel database specificato con sql dinamico?


16

Sto scrivendo un sql dinamico da rilasciare e creare una vista in un database diverso.

Quindi ho scritto:

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

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

Mi dà errore:

'CREATE VIEW' deve essere la prima istruzione in un batch di query.

Se rimuovo l'istruzione USE DATABASE funziona correttamente, ma il database non viene più specificato ....

Come posso risolvere questo problema?

Risposte:


25

È possibile utilizzare le EXECchiamate nidificate . Il contesto del database modificato da USEpersiste nel batch figlio.

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 - Se esegui lo script delle viste utilizzando SMO, è così che funziona anche il framework - le definizioni vengono eseguite in SQL dinamico per aggirare la restrizione
JNK

1
@KingChan - puoi sia votare che accettare, FYI;)
JNK

@JNK +1 ovviamente ~ :)
King Chan,

sicuramente funzionato !! anche se l'ho usato, con molte variabili all'interno della query nidificata, quindi ero un mal di testa a causa della gestione delle quotazioni! ottima soluzione però!

Sei un eroe. Chiamerò il mio primogenito come te.
Jens,

-1

Un modo che ho gestito quando mi imbatto in questo caso è quello di inserire la dichiarazione GO after use.

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

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

Solo per questo, lo statismo GO non funzionerà in exec
King Chan,

2
Questo non funzionerà nel contesto di SQL dinamico. GOè un delimitatore batch negli strumenti client non una parola chiave TSQL.
Martin Smith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.