Sök…


SKAPA VISNING

CREATE VIEW view_EmployeeInfo
AS   
    SELECT EmployeeID,
        FirstName,
        LastName,
        HireDate  
    FROM Employee
GO

Rader från vyer kan väljas ungefär som tabeller:

SELECT FirstName
FROM view_EmployeeInfo

Du kan också skapa en vy med en beräknad kolumn. Vi kan ändra vyn ovan enligt följande genom att lägga till en beräknad kolumn:

CREATE VIEW view_EmployeeReport
AS   
    SELECT EmployeeID,
        FirstName,
        LastName,
        Coalesce(FirstName,'') + ' ' + Coalesce(LastName,'') as FullName,
        HireDate  
    FROM Employee
GO

Den här vyn lägger till en ytterligare kolumn som kommer att visas när du SELECT rader från den. Värdena i den här extra kolumnen beror på fälten FirstName och LastName i tabellen Employee och uppdateras automatiskt bakom kulisserna när dessa fält uppdateras.

SKAPA VIEW med kryptering

CREATE VIEW view_EmployeeInfo
WITH ENCRYPTION
AS   
SELECT EmployeeID, FirstName, LastName, HireDate  
FROM Employee
GO

SKAPA VIEW MED INNER JOIN

CREATE VIEW view_PersonEmployee
AS  
    SELECT P.LastName,
        P.FirstName,
        E.JobTitle
    FROM Employee AS E
    INNER JOIN Person AS P  
        ON P.BusinessEntityID = E.BusinessEntityID
GO

Vyer kan använda joins för att välja data från flera källor som tabeller, tabelfunktioner eller till och med andra vyer. I det här exemplet används kolumnerna Förnamn och Efternamn från persontabellen och kolumnen Jobbtitel från medarbetartabellen.

Den här vyn kan nu användas för att se alla motsvarande rader för chefer i databasen:

SELECT *
FROM view_PersonEmployee
WHERE JobTitle LIKE '%Manager%'

SKAPA Indexerat VIEW

För att skapa en vy med ett index måste vyn skapas med hjälp av WITH SCHEMABINDING nyckelorden:

CREATE VIEW view_EmployeeInfo
WITH SCHEMABINDING
AS   
    SELECT EmployeeID,
        FirstName,
        LastName,
        HireDate  
    FROM [dbo].Employee
GO

Alla grupperade eller icke-klusterade index kan nu skapas:

CREATE UNIQUE CLUSTERED INDEX IX_view_EmployeeInfo
ON view_EmployeeInfo
(
     EmployeeID ASC
)

Det finns några begränsningar för indexerade vyer:

  • Vistdefinitionen kan hänvisa till en eller flera tabeller i samma databas.

  • När det unika klusterindex har skapats kan ytterligare icke-slutna index skapas mot vyn.

  • Du kan uppdatera informationen i de underliggande tabellerna - inklusive bilagor, uppdateringar, raderingar och till och med trunkerar.

  • Du kan inte ändra de underliggande tabellerna och kolumnerna. Vyn skapas med alternativet MED SCHEMABINDING.

  • Den kan inte innehålla COUNT, MIN, MAX, TOP, ytterförbindelser eller några få andra nyckelord eller element.

För mer information om hur du skapar indexerade vyer kan du läsa denna MSDN-artikel

Grupperade VISNINGAR

En grupperad VIEW är baserad på en fråga med en GROUP BY-klausul. Eftersom var och en av grupperna kan ha mer än en rad i basen från vilken den byggdes, är dessa nödvändigtvis endast läsbara VISNINGAR. Sådana VISNINGAR har vanligtvis en eller flera sammanlagda funktioner och de används för rapporteringsändamål. De är också praktiska för att arbeta kring svagheter i SQL. Överväg en VISNING som visar den största försäljningen i varje stat. Frågan är enkel:

https://www.simple-talk.com/sql/t-sql-programming/sql-view-beyond-the-basics/

CREATE VIEW BigSales (state_code, sales_amt_total)
AS SELECT state_code, MAX(sales_amt)
     FROM Sales
    GROUP BY state_code;

UNION-ed VIEWs

VISNINGAR baserade på en UNION eller UNION ALL operation är skrivskyddad eftersom det inte finns ett enda sätt att kartlägga en förändring på bara en rad i en av bastabellerna. UNION-operatören tar bort duplicerade rader från resultaten. Både UNION och UNION ALL operatörer döljer vilket bord raderna kom från. Sådana VISNINGAR måste använda a, eftersom kolumnerna i en UNION [ALL] inte har några egna namn. I teorin bör en UNION av två osammanhängande tabeller, som inte har duplicerade rader i sig, vara uppdaterbar.

https://www.simple-talk.com/sql/t-sql-programming/sql-view-beyond-the-basics/

CREATE VIEW DepTally2 (emp_nbr, dependent_cnt)
AS (SELECT emp_nbr, COUNT(*)
      FROM Dependents
     GROUP BY emp_nbr)
   UNION
   (SELECT emp_nbr, 0
      FROM Personnel AS P2
     WHERE NOT EXISTS 
          (SELECT *
             FROM Dependents AS D2
            WHERE D2.emp_nbr = P2.emp_nbr));


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow