Ansicht in angegebener Datenbank mit dynamischem SQL erstellen?

16

Ich schreibe eine dynamische SQL zum Löschen und Erstellen von Ansichten in verschiedenen Datenbanken.

Also schrieb ich:

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

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

Es gibt mir Fehler:

'CREATE VIEW' muss die erste Anweisung in einem Abfragebatch sein.

Wenn ich die USE DATABASE-Anweisung entferne, funktioniert sie einwandfrei, aber dann wird die Datenbank nicht mehr angegeben.

Wie kann ich dieses Problem lösen?

König Chan
quelle

Antworten:

25

Sie können verschachtelte EXECAnrufe verwenden. Der von geänderte Datenbankkontext USEbleibt im untergeordneten Stapel erhalten.

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
quelle
1
+1 - Wenn Sie Ansichten mit SMO ausschreiben, funktioniert dies auch mit dem Framework - Definitionen werden in dynamischem SQL ausgeführt, um die Einschränkung zu
umgehen
1
@KingChan - Sie können sowohl zustimmen als auch zustimmen, FYI;)
JNK
@ JNK +1 natürlich ~ :)
King Chan
auf jeden Fall hat funktioniert !! obwohl ich es verwendet habe, mit vielen Variablen in der verschachtelten Abfrage, so war ich ein Kopfzerbrechen wegen der Anführungszeichenbehandlung! Tolle Lösung!
Du bist ein Held. Will mein erstgeborenes Kind nach dir benennen.
Jens
-1

Eine Möglichkeit, die ich beim Aufrufen dieses Falls ergriffen habe, besteht darin, die Anweisung GO after use zu platzieren.

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

  SELECT ........something'
exec (@CreateViewStatement)
sgojgini
quelle
Nur damit Sie wissen, wird GO-Anweisung nicht in Exec
King Chan
2
Dies funktioniert im Kontext von dynamischem SQL nicht. GOist ein Batch-Begrenzer in den Client-Tools, kein TSQL-Schlüsselwort.
Martin Smith