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.