Einführung
Eine Ansicht in SQL Server ist eine virtuelle tabellenähnliche Struktur, die auf der Ergebnismenge einer SQL-Anweisung basiert. An der Oberfläche ähnelt eine Ansicht einer Tabelle mit der Signaturstruktur von Zeilen und Spalten. Diese Zeilen und Spalten stammen jedoch aus Tabellen, auf die in der Abfrage verwiesen wird, die die Ansicht definiert.
Wir verwenden Ansichten, um uns auf die Betonsäulen für die Zwecke zu konzentrieren, für die sie erstellt wurden. Ansichten können auch aus Sicherheitsgründen dienen. Sie filtern Spalten in den zugrunde liegenden Tabellen heraus, die man bestimmten Benutzern nicht sichtbar machen möchte. Betrachtet Filterspalten wie eine WHERE-Klausel Zeilen filtert.
Ein weiterer Grund für Ansichten ist die Einfachheit. Sie aggregieren Spalten aus mehreren verschiedenen Tabellen und erzeugen ein allgemeines Erscheinungsbild, das wie eine einzelne Tabelle aussieht.
Arten von Ansichten
Einfache benutzerdefinierte Ansichten lassen sich einfach erstellen. Der Vorgang ähnelt dem Schreiben von Abfragen, die auf eine oder mehrere Tabellen verweisen.
- Indizierte Ansichten sind solche, die wie eine Tabelle materialisiert oder gespeichert wurden. Indizierte Ansichten können die Leistung von Abfragen verbessern, die viele Zeilen aggregieren. Sie sind jedoch nicht geeignet, wenn zugrunde liegende Tabellen häufig aktualisiert werden.
- Partitionierte Ansichten verbinden horizontal partitionierte Daten aus Tabellen lokal (innerhalb derselben Instanz) oder über viele hinweg mithilfe von Verbindungsservern.
- Systemansichten sind die allgemeinen Strukturen, die SQL Server verwendet, um die Katalogmetadaten bereitzustellen. Systemansichten sind die meisten dieser Strukturen, die man abfragt, um die Leistung zu beheben oder eine SQL Server-Instanz zu untersuchen.
Erstellen einer Ansicht aus einer Tabelle
Schauen Sie sich das Beispiel in Listing 1 an. Die erste Anweisung gibt ALLE Datensätze in der Tabelle Purchasing.PurchaseOrders zurück (1a), während die zweite Abfrage nur wenige Spalten zurückgibt (1b).
Mit der zweiten Abfrage können wir eine Ansicht erstellen, die dieselbe Ergebnismenge wie (1b) zurückgibt. Wenn wir dies tun, können wir eine Ansicht abfragen, um die gewünschte Ausgabe zu erhalten. Somit vereinfachen wir die Abfrage für einen Endbenutzer.
-- Listing 1: Creating a Basic User-Defined View
-- 1a
SELECT * FROM
Purchasing.PurchaseOrders;
-- 1b
SELECT
PurchaseOrderID
, SupplierID
, OrderDate
, ExpectedDeliveryDate
FROM Purchasing.PurchaseOrders;
-- 1c
CREATE VIEW Purchasing.QuickOrders
AS
SELECT
PurchaseOrderID
, SupplierID
, OrderDate
, ExpectedDeliveryDate
FROM Purchasing.PurchaseOrders;
-- 1d
SELECT * FROM Purchasing.QuickOrders ;
Erstellen einer Ansicht aus zwei Tabellen
Mit JOINs können wir Daten aus zwei oder mehr Tabellen abrufen, die eine Beziehung haben. Mithilfe von Views können wir den Zugriff auf solche Daten vereinfachen.
Listing 2 (2a) zeigt einen JOIN zwischen Purchasing.PurchaseOrders und Purchasing.PurchaseOrderLines. Wir können aus diesem JOIN eine Ansicht erstellen, die es uns ermöglicht, dieselben Daten mithilfe einer Abfrage abzurufen, wie in (2c) gezeigt.
-- Listing 2: Creating a View from Two Tables
-- 2a
SELECT
po.PurchaseOrderID
, po.SupplierID
, po.OrderDate
, po.ExpectedDeliveryDate
, pol.Description
, pol.ExpectedUnitPricePerOuter
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID;
-- 2b
CREATE VIEW Purchasing.DetailedOrders
AS
SELECT
po.PurchaseOrderID
, po.SupplierID
, po.OrderDate
, po.ExpectedDeliveryDate
, pol.Description
, pol.ExpectedUnitPricePerOuter
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID;
-- 2c
SELECT * FROM Purchasing.DetailedOrders;
Datenbankübergreifende Ansicht erstellen
Durch die mehrteilige Benennung können wir auf Tabellen in einer anderen Datenbank verweisen. Daher können wir JOINs über die Datenbanken hinweg durchführen und Ansichten erstellen, die sich über Datenbanken erstrecken. Dies ist hilfreich für bestimmte Anwendungen, die ihre Daten über Datenbanken in derselben SQL Server-Instanz verteilen.
Listing 3 zeigt einen ähnlichen Fall wie Listing 2, jedoch mit einem Unterschied:Wir fügen der JOIN-Abfrage eine dritte Tabelle aus einer anderen Datenbank hinzu. Beachten Sie, dass wir einen LEFT OUTER JOIN verwenden müssen, da zwischen den Tabellen in beiden Datenbanken keine echte Beziehung besteht. Hier verwenden wir es nur, um das Erstellen einer VIEW zu veranschaulichen, die sich über verschiedene Datenbanken erstreckt.
Wir haben einen Alias in der CREATE VIEW-Anweisung eingeführt, da wir Spalten aus zwei verschiedenen Tabellen mit demselben Namen haben. Wir müssen diese Spalten in solchen Fällen unterscheiden.
-- Listing 3: Creating a View Across Databases
-- 3a
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
,pol.Description
,pol.ExpectedUnitPricePerOuter
,so.orderid
,so.custid
,so.orderdate
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID
LEFT OUTER JOIN TSQLV4.Sales.Orders so
ON po.PurchaseOrderID=so.orderid;
-- 3b
CREATE VIEW Purchasing.DetailedOrdersDistributed
AS
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
,pol.Description
,pol.ExpectedUnitPricePerOuter
,so.orderid
,so.custid
,so.orderdate AS OrdersOrderDate
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID
LEFT OUTER JOIN TSQLV4.Sales.Orders so
ON po.PurchaseOrderID=so.orderid;
-- 3c
SELECT * FROM Purchasing.DetailedOrdersDistributed;
Schauen Sie sich Abbildung 1 an. Sie zeigt das Ergebnis der Ausführung von Listing 3(3c). Beachten Sie, dass die letzten drei Spalten wie TSQLV4.Sales.Orders leer sind Tabelle enthält keine Zeilen, die der JOIN-Bedingung entsprechen.
Instanzübergreifende Ansicht erstellen
Wir können die letzte Anweisung erweitern, indem wir eine Tabelle einführen, die vollständig in einer anderen Instanz lebt.
Um dies zu erreichen, müssen wir zunächst einen Linked Server erstellen. Wir machen das mit dem Code ähnlich dem in Listing 4.
-- Listing 4: Linked Server
USE [master]
GO
EXEC master.dbo.sp_addlinkedserver @server = N'IGIRI01\SQLEXPRESS', @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'IGIRI01\SQLEXPRESS',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
GO
Beachten Sie, wie wir die externe Tabelle mit einem vierteiligen Namen adressieren:
-- Listing 5: Creating a View Across Instances
-- 5a
CREATE VIEW Purchasing.DetailedOrdersExternal
AS
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
,pol.Description
,pol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,ipol.LastEditedWhen
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID
INNER JOIN [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
ON po.PurchaseOrderID=ipol.PurchaseOrderID;
-- 5b
SELECT * FROM Purchasing.DetailedOrdersExternal;
Einschließen von Funktionen in Ansichten
Da Ansichten im Wesentlichen Abfragen sind, können wir auf sie fast alles anwenden, was wir mit normalen Abfragen tun. Wir können Funktionen, WHERE-Klauseln, CASE-Ausdrücke, Aliase usw. einschließen.
Die ORDER BY-Klausel ist jedoch nicht zulässig, außer Sie verwenden den „TOP 100-Hack“. Listing 6 bis 9 veranschaulichen die Verwendung dieser Klauseln in Views.
-- Listing 6: Creating a View with a Function
CREATE VIEW Purchasing.DetailedOrdersComplex
AS
SELECT
ipol.PurchaseOrderID
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
-- Listing 7: Creating a View with a WHERE Clause
CREATE VIEW Purchasing.DetailedOrdersComplexFilt
AS
SELECT
ipol.PurchaseOrderID
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
WHERE ipol.PurchaseOrderID<10;
-- Listing 8: Creating a View a TOP Clause
CREATE VIEW Purchasing.DetailedOrdersComplexTop
AS
SELECT TOP 10
ipol.PurchaseOrderID
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
-- Listing 9: Creating a View with a CASE Expression
CREATE VIEW Purchasing.DetailedOrdersComplexTop
AS
SELECT TOP 10
CASE
ipol.PurchaseOrderID
WHEN 1 THEN 'First Order'
WHEN 2 THEN 'Second Order'
END PurchaseOrder
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
Indizierte Aufrufe
Wir haben weiter oben in diesem Artikel auf indizierte Ansichten verwiesen. Indizierte Ansichten können die Leistung verbessern, außer in den Fällen, in denen zugrunde liegende Tabellen schreibintensiv sind. SQL Server erfordert, dass bestimmte SET-Optionen aktiviert sind, bevor indizierte Ansichten erstellt oder bestimmte Operationen an ihnen ausgeführt werden können.
Die WITH SCHEMABINDING-Klausel sollte verwendet werden, wenn eine View erstellt wird, um ihr einen Index hinzuzufügen. Diese Klausel ordnet die Ansicht strikt den zugrunde liegenden Objekten zu. Daher können solche Objekte nicht gelöscht werden.
-- Listing 10: Creating an Indexed View
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON;
CREATE VIEW Purchasing.DetailedOrdersIndexed
WITH SCHEMABINDING
AS
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
FROM Purchasing.PurchaseOrders po;
CREATE UNIQUE CLUSTERED INDEX IX_ID
ON Purchasing.DetailedOrdersIndexed (PurchaseOrderID);
Schlussfolgerung
In diesem Artikel haben wir Ansichten auf einer gewissen Detailebene untersucht. Wir haben View-Typen kurz behandelt und einige Beispiele für benutzerdefinierte Views gegeben und wie wir JOINs verwendet haben, um Views zu realisieren, die von vielen Tabellen abhängen. Wir haben auch komplexe Ansichten behandelt, die sowohl Funktionen als auch indizierte Ansichten enthalten.
Referenzen
- Aufrufe
- Indizierte Ansichten
- Indizierte Ansichten in SQL Server erstellen