Introduktion
En visning i SQL Server er en virtuel tabellignende struktur baseret på resultatsættet af en SQL-sætning. På overfladen ligner en visning en tabel med signaturstrukturen af rækker og kolonner. Disse rækker og kolonner kommer dog fra tabeller, der henvises til i forespørgslen, som definerer visningen.
Vi bruger Views til at fokusere på de konkrete søjler til de formål, de er skabt til. Visninger kan også tjene af sikkerhedsmæssige årsager. De filtrerer kolonner fra i de underliggende tabeller, som man ikke ønsker at gøre synlige for bestemte brugere. Viser filterkolonner som en WHERE-sætning filtrerer rækker.
En anden grund til Views er enkelhed. De samler kolonner fra flere forskellige tabeller og skaber et generelt udseende, der ligner en enkelt tabel.
Visningstyper
Grundlæggende brugerdefinerede visninger er nemme at oprette. Processen ligner at skrive forespørgsler, der refererer til en eller flere tabeller.
- Indekserede visninger er dem, der er blevet materialiseret eller gemt som en tabel. Indekserede visninger kan forbedre ydeevnen af forespørgsler, der samler mange rækker. De er dog ikke egnede, hvis underliggende tabeller ofte opdateres.
- Partitionerede visninger forbinder vandret opdelte data fra tabeller lokalt (inden for samme instans) eller på tværs af mange ved hjælp af linkede servere.
- Systemvisninger er de almindelige strukturer, som SQL Server bruger til at afsløre katalogmetadata. Systemvisninger er de fleste af de strukturer, man forespørger om til fejlfinding af ydeevne eller undersøgelse af en SQL Server-instans.
Oprettelse af en visning fra ét bord
Tag et kig på eksemplet i liste 1. Den første sætning returnerer ALLE poster i tabellen Indkøb.Indkøb (1a), mens den anden forespørgsel kun returnerer nogle få kolonner (1b).
Ved at bruge den anden forespørgsel kan vi oprette en visning, der returnerer det samme resultatsæt som (1b). Når vi gør dette, kan vi forespørge en visning for at få det ønskede output. Således forenkler vi forespørgslen for en slutbruger.
-- Liste 1:Oprettelse af en grundlæggende brugerdefineret visning-- 1aSELECT * FROM Purchasing.PurchaseOrders;-- 1bSELECT PurchaseOrderID , SupplierID , OrderDate , ExpectedDeliveryDate FROM Purchasing.PurchaseOrders;-- VIEW PurchaseOrderSSELECT. PurchaseOrderID , SupplierID , OrderDate , ExpectedDeliveryDate FROM Purchasing.PurchaseOrders;-- 1dSELECT * FROM Purchasing.QuickOrders;
Oprettelse af en visning fra to borde
Ved hjælp af JOINs kan vi hente data fra to eller flere tabeller, der har en relation. Ved at bruge Views kan vi forenkle adgangen til sådanne data.
Liste 2 (2a) viser en JOIN mellem Purchasing.PurchaseOrders og Purchasing.PurchaseOrderLines. Vi kan oprette en visning fra denne JOIN, og den vil give os mulighed for at hente de samme data ved hjælp af en forespørgsel, som vist i (2c).
-- Liste 2:Oprettelse af en visning fra to tabeller-- 2a VÆLG po.PurchaseOrderID , po.SupplierID , po.OrderDate , po.ExpectedDeliveryDate , pol.Description , pol.ExpectedUnitPricePerOuter FROM Purchasing.Purchas JOIN Purchasing.PurchaseOrderLines pol PÅ po.PurchaseOrderID=pol.PurchaseOrderID;-- 2b OPRET VISNING Purchasing.DetailedOrders AS SELECT po.PurchaseOrderID , po.SupplierID , po.OrderDate , po.DeliveryPrice, pol.PurchaseOrderID , po.SupplierID , po.OrderDate , po.ExpectedDeliver, pol.P.P. PurchaseOrders po INNER JOIN Purchasing.PurchaseOrderLines pol ON po.PurchaseOrderID=pol.PurchaseOrderID;-- 2c SELECT * FROM Purchasing.DetailedOrders;
Oprettelse af en visning på tværs af databaser
Ved at bruge flerdelt navngivning kan vi referere til tabeller i en anden database. Derfor kan vi lave JOINs på tværs af databaserne og skabe Views, der spænder over databaser. Det er nyttigt for visse applikationer, der spreder deres data på tværs af databaser i den samme SQL Server-instans.
Liste 3 viser et lignende tilfælde som liste 2, men med en forskel:vi tilføjer en tredje tabel til JOIN-forespørgslen fra en anden database. Bemærk, at vi er nødt til at bruge en LEFT OUTER JOIN, da der ikke eksisterer noget reelt forhold mellem tabellerne i begge databaser. Her bruger vi det kun til at illustrere at skabe en VIEW, der spænder over forskellige databaser.
Vi har indført et alias i CREATE VIEW-sætningen, da vi har kolonner fra to forskellige tabeller med samme navn. Vi skal skelne mellem disse kolonner i sådanne tilfælde.
-- Liste 3:Oprettelse af en visning på tværs af databaser -- 3a SELECT po.PurchaseOrderID ,po.SupplierID ,po.OrderDate ,po.ExpectedDeliveryDate ,pol.Description ,pol.ExpectedUnitPricePerOuter ,so.orderid ,so. custid ,so.orderdate FRA Purchasing.PurchaseOrders po INNER JOIN Purchasing.PurchaseOrderLines pol ON po.PurchaseOrderID=pol.PurchaseOrderID LEFT OUTER JOIN TSQLV4.Sales.Orders so ON po.Purchase.Desurderid CREDitailOrderid=Køb.BestiltOrderid CREDitailOrderid; AS SELECT po.PurchaseOrderID ,po.SupplierID ,po.OrderDate ,po.ExpectedDeliveryDate ,pol.Description ,pol.ExpectedUnitPricePerOuter ,so.orderid ,so.custid ,so.orderdate AS OrdersOrderDate FROM PurchaseDato FROM PurchasePurchain orders. ON po.PurchaseOrderID=pol.PurchaseOrderID VENSTRE YDRE JOIN TSQLV4.Sales.Orders så ON po.PurchaseOrderID=so.orderid;-- 3c VÆLG * FRA Purchasing.DetailedOrdersDistributed;
Tag et kig på figur 1. Den viser resultatet af udførelse af Listing 3(3c). Bemærk, at de sidste tre kolonner er tomme, da TSQLV4.Sales.Orders tabellen har ingen rækker, der matcher JOIN-betingelsen.
Oprettelse af en visning på tværs af forekomster
Vi kan udvide det sidste udsagn ved at introducere en tabel, der helt lever i en anden instans.
For at opnå dette skal vi først oprette en linket server. Vi gør det med koden svarende til den, der er vist i liste 4.
-- Liste 4:Linket serverUSE [master]GOEXEC 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=NULLGO
Bemærk, hvordan vi adresserer den eksterne tabel ved hjælp af et firedelt navn:
-- Liste 5:Oprettelse af en visning på tværs af forekomster-- 5aCREATE VIEW Purchasing.DetailedOrdersExternal AS SELECT po.PurchaseOrderID ,po.SupplierID ,po.OrderDate ,po.ExpectedDeliveryDate ,pol.Description ,pol.P.Exp. .StockItemID ,ipol.LastEditedWhen FRA Purchasing.PurchaseOrders po INNER JOIN Purchasing.PurchaseOrderLines pol ON po.PurchaseOrderID=pol.PurchaseOrderID INNER JOIN [IGIRI01\SQLEXPRESS].[Purchase.Purchase]købsid. ipol.PurchaseOrderID;-- 5bSELECT * FROM Purchasing.DetailedOrdersExternal;
Inkluderer funktioner i visninger
Da visninger i bund og grund er forespørgsler, kan vi anvende næsten alt, hvad vi gør med almindelige forespørgsler på dem. Vi kan inkludere funktioner, WHERE-sætninger, CASE-udtryk, aliaser osv.
ORDER BY-klausulen er dog ikke tilladt, undtagen at du bruger "TOP 100-hacket". Listerne 6 til 9 illustrerer brugen af disse klausuler i Views.
-- Liste 6:Oprettelse af en visning med en funktionCREATE VIEW Purchasing.DetailedOrdersComplex AS SELECT ipol.PurchaseOrderID ,ipol.Description ,ipol.ExpectedUnitPricePerOuter ,ipol.StockItemID ,CONVERT(VARCHAR) [IGIRI01\SQLEXPRESS].[WWI].[Indkøb].[PurchaseOrderLines] ipol
-- Liste 7:Oprettelse af en visning med en WHERE-klausul CREATE VIEW Purchasing.DetailedOrdersComplexFilt AS SELECT ipol.PurchaseOrderID ,ipol.Description ,ipol.ExpectedUnitPricePerOuter ,ipol.StockItemID ,CONVERT(1EditWARCH3,Sidste1VarCH3,Sidste1VarCH3) LastEditedLongDate FRA [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol WHERE ipol.PurchaseOrderID<10;
-- Liste 8:Oprettelse af en visning en TOP-klausul OPRET VISNING Purchasing.DetailedOrdersComplexTop AS SELECT TOP 10 ipol.PurchaseOrderID ,ipol.Description ,ipol.ExpectedUnitPricePerOuter ,ipol.StockItemID ,LastE1CONVERT,When1CONVERT,Wen1 AS LastEditedLongDate FRA [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
-- Liste 9:Oprettelse af en visning med et CASE-udtryk OPRET VISNING Indkøb.DetailedOrdersComplexTop AS SELECT TOP 10 CASE ipol.PurchaseOrderID NÅR 1 SÅ 'Første ordre' NÅR 2 SÅ 'Anden ordre' SLUT Købsordre ,ipol. Beskrivelse ,ipol.ExpectedUnitPricePerOuter ,ipol.StockItemID ,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrdercode>lines]
Indekserede visninger
Vi henviste til indekserede visninger tidligere i artiklen. Indekserede visninger kan forbedre ydeevnen, bortset fra de tilfælde, hvor underliggende tabeller er skrivetunge. SQL Server kræver, at visse SET-indstillinger er aktiveret, før du opretter indekserede visninger eller udfører bestemte handlinger på dem.
WITH SCHEMABINDING-sætningen skal bruges, når du opretter en visning for at sætte et indeks på den. Denne klausul knytter visningen strengt til de underliggende objekter. Sådanne genstande kan således ikke tabes.
-- Liste 10:Oprettelse af et indekseret visningssæt ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON; OPRET VISNING Purchasing.DetailedOrdersIndexed WITH SCHEMABINDING AS SELECT po.PurchaseOrderID ,po.SupplierID ,po.OrderDate ,po.ExpectedDeliveryDate FROM Purchasing.PurchaseOrders po;CREATE UNIQUE CLUSTERED INDEXOrchaId INDEXOrchai;
Konklusion
I denne artikel har vi undersøgt synspunkter på et eller andet detaljeringsniveau. Vi dækkede kort typer af visninger og gav flere eksempler på brugerdefinerede visninger, og hvordan vi brugte JOINs til at realisere visninger, der afhænger af mange tabeller. Vi dækkede også komplekse visninger, der inkluderer funktioner såvel som indekserede visninger.
Referencer
- Visninger
- Indekserede visninger
- Opret indekserede visninger i SQL Server