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?

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)

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)

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.