Einleitung

Das Erstellen von Views in SQL Server ist eine häufige Anforderung, jedoch kann es kompliziert werden, wenn man versucht, eine View in einer anderen Datenbank zu erstellen. Im Gegensatz zu Tabellen, bei denen man den Datenbanknamen im CREATE TABLE-Statement angeben kann, erlaubt SQL Server dies nicht für Views. Dieser Blogbeitrag erklärt, warum dies so ist und zeigt einen funktionierenden Ansatz auf.

Warum direkte Methoden nicht funktionieren

Create View mit Datenbanknamen

Fehler 166: SQL Server erlaubt es nicht, den Datenbanknamen im CREATE VIEW-Statement anzugeben. Dies führt zu einem Fehler, da eine View nur in der aktuellen Datenbank erstellt werden kann.

    USE-Anweisung mit sp_executesql

    Fehler 111: Auch der Versuch, den Datenbankkontext mit USE [Database] zu ändern und dann CREATE VIEW auszuführen, scheitert. SQL Server verlangt, dass CREATE VIEW die erste Anweisung in einem Abfragebatch ist, was durch das Entfernen von GO ebenfalls nicht erreicht wird.

    Der funktionierende Ansatz

    Der funktionierende Ansatz besteht darin, den Kontext von sp_executesql zu ändern, indem man den Datenbank- und Schemanamen voranstellt. So wird sichergestellt, dass die dynamische SQL im Kontext der gewünschten Datenbank ausgeführt wird. Hier ein Beispiel:

    sqlCode kopierenDECLARE @sql NVARCHAR(MAX)
    SET @sql = N'CREATE VIEW schemaName.viewName AS SELECT * FROM tableName'
    EXEC databaseName.sys.sp_executesql @sql
    

    Fazit

    Das Erstellen von Views in einer anderen Datenbank in SQL Server ist aufgrund von Beschränkungen in der Syntax und den Anforderungen an die Abfolge von SQL-Anweisungen nicht direkt möglich. Der beschriebene Ansatz, sp_executesql mit der Angabe des Datenbankkontexts zu verwenden, bietet eine praktikable Lösung.