Delen via


CREATE VIEW (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric Preview

Hiermee maakt u een virtuele tabel waarvan de inhoud (kolommen en rijen) door een query wordt gedefinieerd. Gebruik deze instructie om een weergave van de gegevens in een of meer tabellen in de database te maken. Een weergave kan bijvoorbeeld worden gebruikt voor de volgende doeleinden:

  • Om de aandacht te vestigen, te vereenvoudigen en de perceptie aan te passen die elke gebruiker van de database heeft.

  • Als een beveiligingsmechanisme door gebruikers toegang te geven tot gegevens via de weergave, zonder de gebruikers machtigingen te verlenen om rechtstreeks toegang te krijgen tot de onderliggende basistabellen.

  • Om een achterwaarts compatibele interface te bieden voor het emuleren van een tabel waarvan het schema is gewijzigd.

Transact-SQL syntaxis-conventies

Syntax

Syntaxis voor SQL Server en Azure SQL Database.

CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ]
[ ; ]  

<view_attribute> ::=
{  
    [ ENCRYPTION ]  
    [ SCHEMABINDING ]  
    [ VIEW_METADATA ]
}

Syntaxis voor Azure Synapse Analytics en Parallel Data Warehouse.

CREATE VIEW [ schema_name . ] view_name [  ( column_name [ ,...n ] ) ]   
AS <select_statement>   
[;]  

<select_statement> ::=  
    [ WITH <common_table_expression> [ ,...n ] ]  
    SELECT <select_criteria>  

Syntaxis voor Microsoft Fabric Data Warehouse en SQL-analyse-eindpunt.

CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [  ( column_name [ ,...n ] ) ]   
[ WITH <view_attribute> [ ,...n ] ] AS <select_statement>   
[;]

<view_attribute> ::=
{  
    [ SCHEMABINDING ]  
}

<select_statement> ::=  
    [ WITH <common_table_expression> [ ,...n ] ]  
    SELECT <select_criteria>  

Arguments

OR ALTER

Van toepassing op: Azure SQL Database en SQL Server (te beginnen met SQL Server 2016 (13.x) SP1).

Wijzigt de weergave alleen voorwaardelijk als deze al bestaat.

schema_name
Is de naam van het schema waartoe de weergave behoort.

view_name
Is de naam van de weergave. Weergavenamen moeten de regels voor id's volgen. Het opgeven van de naam van de weergave-eigenaar is optioneel.

column
Is de naam die moet worden gebruikt voor een kolom in een weergave. Een kolomnaam is alleen vereist wanneer een kolom wordt afgeleid van een rekenkundige expressie, een functie of een constante; wanneer twee of meer kolommen anders dezelfde naam hebben, meestal vanwege een join; of wanneer een kolom in een weergave een andere naam heeft dan die van de kolom waaruit deze wordt afgeleid. Kolomnamen kunnen ook worden toegewezen in de SELECT instructie.

Als de kolom niet is opgegeven, krijgen de weergavekolommen dezelfde namen als de kolommen in de SELECT instructie.

Note

In de kolommen voor de weergave zijn de machtigingen voor een kolomnaam van toepassing op een CREATE VIEW of ALTER VIEW instructie, ongeacht de bron van de onderliggende gegevens. Als bijvoorbeeld machtigingen worden verleend voor de SalesOrderID kolom in een CREATE VIEW-instructie, kan een ALTER VIEW instructie de SalesOrderID kolom een andere kolomnaam geven, zoals OrderRef, en nog steeds de machtigingen hebben die zijn gekoppeld aan de weergave met behulp van SalesOrderID.

AS

Hiermee geeft u de acties op die de weergave moet uitvoeren.

select_statement

De SELECT instructie waarmee de weergave wordt gedefinieerd. De instructie kan meer dan één tabel en andere weergaven gebruiken. De juiste machtigingen zijn vereist om te selecteren uit de objecten waarnaar wordt verwezen in de SELECT component van de weergave die wordt gemaakt.

Een weergave hoeft geen subset van de rijen en kolommen van één bepaalde tabel te zijn. Er kan een weergave worden gemaakt die gebruikmaakt van meer dan één tabel of andere weergaven met een SELECT component van elke complexiteit.

In een geïndexeerde weergavedefinitie moet de SELECT instructie één tabelinstructie of een multitabel JOIN met optionele aggregatie zijn.

De SELECT componenten in een weergavedefinitie kunnen niet het volgende bevatten:

  • Een ORDER BY component, tenzij er ook een TOP component in de selectielijst van de SELECT instructie staat

    Important

    De ORDER BY component wordt alleen gebruikt om de rijen te bepalen die worden geretourneerd door de TOP of OFFSET component in de weergavedefinitie. De ORDER BY component garandeert geen geordende resultaten wanneer de weergave wordt opgevraagd, tenzij ORDER BY deze ook is opgegeven in de query zelf.

  • Het trefwoord INTO

  • De OPTION component

  • Een verwijzing naar een tijdelijke tabel of een tabelvariabele.

Omdat select_statement de SELECT instructie gebruikt, is het geldig om joinhints en tabelhints te gebruiken zoals opgegeven in de FROM component. Zie FROM (Transact-SQL) en SELECT (Transact-SQL) voor meer informatie.

Functies en meerdere SELECT instructies gescheiden door UNION of UNION ALL kunnen worden gebruikt in select_statement.

CHECK OPTION

Hiermee dwingt u alle instructies voor het wijzigen van gegevens af die voor de weergave worden uitgevoerd om de criteria te volgen die zijn ingesteld in select_statement. Wanneer een rij wordt gewijzigd via een weergave, zorgt u WITH CHECK OPTION ervoor dat de gegevens zichtbaar blijven in de weergave nadat de wijziging is doorgevoerd.

Note

Dit CHECK OPTION geldt alleen voor updates die via de weergave zijn gemaakt. Het heeft geen toepasselijkheid op updates die rechtstreeks worden uitgevoerd op de onderliggende tabellen van een weergave.

ENCRYPTION

van toepassing op: SQL Server 2008 (10.0.x) en hoger en Azure SQL Database.

Versleutelt de vermeldingen in sys.syscomments die de tekst van de CREATE VIEW instructie bevatten. Hiermee WITH ENCRYPTION voorkomt u dat de weergave wordt gepubliceerd als onderdeel van SQL Server-replicatie.

SCHEMABINDING

Hiermee wordt de weergave gekoppeld aan het schema van de onderliggende tabel of tabellen. Wanneer SCHEMABINDING dit is opgegeven, kunnen de basistabel of -tabellen niet worden gewijzigd op een manier die van invloed is op de weergavedefinitie. De weergavedefinitie zelf moet eerst worden gewijzigd of verwijderd om afhankelijkheden te verwijderen van de tabel die moet worden gewijzigd. Wanneer u deze gebruikt SCHEMABINDING, moet de select_statement de tweedelige namen (schema) bevatten.object) van tabellen, weergaven of door de gebruiker gedefinieerde functies waarnaar wordt verwezen. Alle objecten waarnaar wordt verwezen, moeten zich in dezelfde database bevinden.

Weergaven of tabellen die deelnemen aan een weergave die is gemaakt met de COMPONENT SCHEMABINDING, kunnen niet worden verwijderd, tenzij die weergave wordt verwijderd of gewijzigd, zodat deze geen schemabinding meer heeft. Anders genereert de database-engine een fout. Het uitvoeren van ALTER TABLE instructies voor tabellen die deelnemen aan weergaven die schemabinding hebben, mislukken ook wanneer deze instructies van invloed zijn op de weergavedefinitie.

VIEW_METADATA

Hiermee geeft u op dat het exemplaar van SQL Server terugkeert naar de DB-Library, ODBC en OLE DB API's van de metagegevens over de weergave, in plaats van de basistabel of tabellen, wanneer metagegevens in de bladermodus worden aangevraagd voor een query die verwijst naar de weergave. Metagegevens in de bladermodus zijn aanvullende metagegevens die het exemplaar van SQL Server retourneert naar deze API's aan de clientzijde. Met deze metagegevens kunnen de API's aan de clientzijde updatable cursors aan de clientzijde implementeren. Metagegevens in de bladermodus bevatten informatie over de basistabel waartoe de kolommen in de resultatenset behoren.

Voor weergaven die zijn gemaakt met VIEW_METADATA, retourneert de metagegevens in de bladermodus de naam van de weergave en niet de namen van de basistabel wanneer kolommen uit de weergave in de resultatenset worden beschreven.

Wanneer een weergave wordt gemaakt met behulp van WITH VIEW_METADATAalle kolommen, met uitzondering van een tijdstempelkolom , kunnen deze worden bijgewerkt als de weergave wel INSTEAD OF INSERT of INSTEAD OF UPDATE niet wordt geactiveerd. Zie Opmerkingen voor meer informatie over bijwerkende weergaven.

Remarks

Een weergave kan alleen worden gemaakt in de huidige database. De CREATE VIEW instructie moet de eerste instructie in een querybatch zijn. Een weergave kan maximaal 1024 kolommen bevatten.

Bij het uitvoeren van query's via een weergave controleert de database-engine of alle databaseobjecten waarnaar in de instructie wordt verwezen, bestaan en of deze geldig zijn in de context van de instructie en dat de instructies voor gegevenswijziging geen inbreuk maken op de regels voor gegevensintegriteit. Een controle die mislukt, retourneert een foutbericht. Met een geslaagde controle wordt de actie omgezet in een actie op basis van de onderliggende tabel of tabellen.

Als een weergave afhankelijk is van een tabel of weergave die is verwijderd, genereert de database-engine een foutbericht wanneer iemand probeert de weergave te gebruiken. Als er een nieuwe tabel of weergave wordt gemaakt en de tabelstructuur niet verandert van de vorige basistabel om de tabel te vervangen die is verwijderd, wordt de weergave opnieuw bruikbaar. Als de nieuwe tabel of weergavestructuur wordt gewijzigd, moet de weergave worden verwijderd en opnieuw worden gemaakt.

Als er geen weergave met de SCHEMABINDING component wordt gemaakt, voert u sp_refreshview uit wanneer er wijzigingen worden aangebracht in de objecten onder de weergave die van invloed zijn op de definitie van de weergave. Anders kan de weergave onverwachte resultaten opleveren wanneer er een query wordt uitgevoerd.

Wanneer een weergave wordt gemaakt, wordt informatie over de weergave opgeslagen in de volgende catalogusweergaven: sys.views, sys.columns en sys.sql_expression_afhankelijkheden. De tekst van de CREATE VIEW instructie wordt opgeslagen in de catalogusweergave sys.sql_modules .

Een query die gebruikmaakt van een index in een weergave die is gedefinieerd met numerieke of float-expressies , kan een resultaat hebben dat verschilt van een vergelijkbare query die niet gebruikmaakt van de index in de weergave. Dit verschil kan worden veroorzaakt door afrondingsfouten tijdens INSERT, DELETEof UPDATE acties op onderliggende tabellen.

De database-engine slaat de instellingen op van SET QUOTED_IDENTIFIER en SET ANSI_NULLS wanneer er een weergave wordt gemaakt. Deze oorspronkelijke instellingen worden gebruikt om de weergave te parseren wanneer de weergave wordt gebruikt. Daarom hebben alle clientsessie-instellingen voor SET QUOTED_IDENTIFIER en SET ANSI_NULLS hebben geen invloed op de weergavedefinitie wanneer de weergave wordt geopend.

In Azure Synapse Analytics bieden weergaven geen ondersteuning voor schemabinding. Als er daarom wijzigingen worden aangebracht in de onderliggende objecten, moet u de weergave verwijderen en opnieuw maken om de onderliggende metagegevens te vernieuwen. Zie T-SQL-weergaven met toegewezen SQL-pool en serverloze SQL-pool in Azure Synapse Analytics voor meer informatie.

In Azure Synapse Analytics worden updatable weergaven, DML-triggers (van het type AFTER of INSTEAD OF) en gepartitioneerde weergaven niet ondersteund. Zie T-SQL-weergaven met toegewezen SQL-pool en serverloze SQL-pool in Azure Synapse Analytics voor meer informatie.

In Azure Synapse Analytics worden gepartitioneerde weergaven niet ondersteund. Zie T-SQL-weergaven met toegewezen SQL-pool en serverloze SQL-pool in Azure Synapse Analytics voor meer informatie.

In de Fabric SQL-database kunnen weergaven worden gemaakt, maar deze worden niet gespiegeld in de Fabric OneLake. Zie Beperkingen van sql-databasespiegeling voor infrastructuurresourcesvoor meer informatie.

Updatable views

U kunt de gegevens van een onderliggende basistabel wijzigen via een weergave, zolang aan de volgende voorwaarden wordt voldaan:

  • Alle wijzigingen, inclusief UPDATE, INSERTen DELETE instructies, moeten verwijzen naar kolommen uit slechts één basistabel.

  • De kolommen die in de weergave worden gewijzigd, moeten rechtstreeks verwijzen naar de onderliggende gegevens in de tabelkolommen. De kolommen kunnen niet op een andere manier worden afgeleid, zoals via het volgende:

    • Een statistische functie: AVG, , COUNTSUM, , MIN, MAX, GROUPING, , STDEV, STDEVP, en VARVARP.

    • A computation. De kolom kan niet worden berekend vanuit een expressie die gebruikmaakt van andere kolommen. Kolommen die worden gevormd met behulp van de setoperator UNION, UNION ALL, CROSSJOIN, EXCEPT en INTERSECT zijn ook niet updatable.

  • De kolommen die worden gewijzigd, worden niet beïnvloed door GROUP BY, HAVINGof DISTINCT componenten.

  • TOP wordt nergens in de select_statement van de weergave samen met de WITH CHECK OPTION component gebruikt.

De vorige beperkingen zijn van toepassing op subquery's in de FROM-component van de weergave, net zoals ze van toepassing zijn op de weergave zelf. Over het algemeen moet de database-engine ondubbelzinnig wijzigingen van de weergavedefinitie kunnen traceren naar één basistabel. Zie Gegevens wijzigen via een weergave-voor meer informatie.

Als de vorige beperkingen verhinderen dat u gegevens rechtstreeks via een weergave wijzigt, kunt u de volgende opties overwegen:

  • IN PLAATS VAN triggers

    INSTEAD OF triggers kunnen worden gemaakt in een weergave om een weergave updatable te maken. De INSTEAD OF trigger wordt uitgevoerd in plaats van de instructie voor het wijzigen van gegevens waarop de trigger is gedefinieerd. Met deze trigger kan de gebruiker de set acties opgeven die moeten gebeuren om de wijzigingsinstructie van gegevens te verwerken. Als er dus een INSTEAD OF trigger bestaat voor een weergave van een specifieke instructie voor het wijzigen van gegevens (INSERT, UPDATEof DELETE), kan de bijbehorende weergave worden bijgewerkt via die instructie. Zie INSTEAD OF voor meer informatie over triggers.

  • Partitioned views

    Als de weergave een gepartitioneerde weergave is, kan de weergave worden bijgewerkt, afhankelijk van bepaalde beperkingen. Wanneer dit nodig is, onderscheidt de database-engine lokale gepartitioneerde weergaven als de weergaven waarin alle deelnemende tabellen en de weergave zich op hetzelfde exemplaar van SQL Server bevinden en gedistribueerde gepartitioneerde weergaven als de weergaven waarin ten minste één van de tabellen in de weergave zich op een andere of externe server bevindt.

Partitioned views

Een gepartitioneerde weergave is een weergave die wordt gedefinieerd door lidtabellen UNION ALL die op dezelfde manier zijn gestructureerd, maar afzonderlijk zijn opgeslagen als meerdere tabellen in hetzelfde exemplaar van SQL Server of in een groep autonome exemplaren van SQL Server-servers, federatieve databaseservers genoemd.

Note

De voorkeursmethode voor het partitioneren van gegevens lokaal naar één server is via gepartitioneerde tabellen. Zie Gepartitioneerde tabellen en indexenvoor meer informatie.

Wanneer u een partitioneringsschema ontwerpt, moet het duidelijk zijn welke gegevens bij elke partitie horen. De gegevens voor de Customers tabel worden bijvoorbeeld gedistribueerd in drie lidtabellen op drie serverlocaties: Customers_33 op Server1, Customers_66 op Server2en Customers_99 op Server3.

Er wordt een gepartitioneerde weergave Server1 op de volgende manier gedefinieerd:

--Partitioned view as defined on Server1  
CREATE VIEW Customers  
AS  
--Select from local member table.  
SELECT *  
FROM CompanyData.dbo.Customers_33  
UNION ALL  
--Select from member table on Server2.  
SELECT *  
FROM Server2.CompanyData.dbo.Customers_66  
UNION ALL  
--Select from member table on Server3.  
SELECT *  
FROM Server3.CompanyData.dbo.Customers_99;  

Over het algemeen wordt gezegd dat een weergave een gepartitioneerde weergave is als deze van het volgende formulier is:

SELECT <select_list1>  
FROM T1  
UNION ALL  
SELECT <select_list2>  
FROM T2  
UNION ALL  
...  
SELECT <select_listn>  
FROM Tn;  

Voorwaarden voor het maken van gepartitioneerde weergaven

  1. De selectie list

    • Selecteer in de kolomlijst van de weergavedefinitie alle kolommen in de lidtabellen.

    • Zorg ervoor dat de kolommen in dezelfde rangschikkingspositie van elk select list van hetzelfde type zijn, inclusief sorteringen. Het is niet voldoende voor de kolommen om impliciet converteerbare typen te zijn, zoals over het algemeen het geval UNIONis.

      Bovendien moet ten minste één kolom (bijvoorbeeld <col>) worden weergegeven in alle geselecteerde lijsten in dezelfde rangschikkenpositie. Definieer <col> op een manier waarop de lidtabellen T1, ..., Tn respectievelijk CHECK-beperkingen C1, ..., Cn hebben gedefinieerd <col>.

      C1 De beperking die voor de tabel T1 is gedefinieerd, moet van het volgende formulier zijn:

      C1 ::= < simple_interval > [ OR < simple_interval > OR ...]  
      < simple_interval > :: =   
      < col > { < | > | \<= | >= | = < value >}   
      | < col > BETWEEN < value1 > AND < value2 >  
      | < col > IN ( value_list )  
      | < col > { > | >= } < value1 > AND  
      < col > { < | <= } < value2 >  
      
    • De beperkingen moeten zodanig zijn dat elke opgegeven waarde <col> kan voldoen aan een van de beperkingen C1, ..., Cn , zodat de beperkingen een set niet-aaneengesloten of niet-aaneengesloten intervallen vormen. De kolom <col> waarop de niet-aaneengesloten beperkingen worden gedefinieerd, wordt de partitioneringskolom genoemd. De partitioneringskolom kan verschillende namen hebben in de onderliggende tabellen. De beperkingen moeten een ingeschakelde en vertrouwde status hebben om te voldoen aan de eerder genoemde voorwaarden van de partitioneringskolom. Als de beperkingen zijn uitgeschakeld, schakelt u beperkingscontrole opnieuw in met behulp van de CHECK CONSTRAINT *constraint_name* optie van ALTER TABLEen gebruikt u de WITH CHECK optie om deze te valideren.

      In de volgende voorbeelden ziet u geldige sets beperkingen:

      { [col < 10], [col between 11 and 20] , [col > 20] }  
      { [col between 11 and 20], [col between 21 and 30], [col between 31 and 100] }  
      
    • Dezelfde kolom kan niet meerdere keren worden gebruikt in de selectielijst.

  2. Partitioning column

    • De partitioneringskolom maakt deel uit van de PRIMAIRE SLEUTEL van de tabel.

    • Het kan geen berekende kolom, identiteit, standaard of tijdstempel zijn.

    • Als er meer dan één beperking is op dezelfde kolom in een lidtabel, negeert de database-engine alle beperkingen en houdt deze niet in overweging bij het bepalen of de weergave een gepartitioneerde weergave is. Als u wilt voldoen aan de voorwaarden van de gepartitioneerde weergave, moet u ervoor zorgen dat er slechts één partitioneringsbeperking is voor de partitioneringskolom.

    • Er gelden geen beperkingen voor de updatability van de partitioneringskolom.

  3. Lidtabellen of onderliggende tabellen T1, ..., Tn

    • De tabellen kunnen lokale tabellen of tabellen zijn van andere computers waarop SQL Server wordt uitgevoerd waarnaar wordt verwezen via een vierdelige naam of een op OPENDATASOURCE- of OPENROWSET gebaseerde naam. De syntaxis VAN OPENDATASOURCE en OPENROWSET kan een tabelnaam opgeven, maar geen passthrough-query. Zie OPENDATASOURCE (Transact-SQL) en OPENROWSET (Transact-SQL) voor meer informatie.

      Als een of meer lidtabellen extern zijn, wordt de weergave gedistribueerde gepartitioneerde weergave genoemd en zijn aanvullende voorwaarden van toepassing. Ze worden verderop in deze sectie beschreven.

    • Dezelfde tabel kan niet twee keer worden weergegeven in de set tabellen die worden gecombineerd met de UNION ALL instructie.

    • De lidtabellen kunnen geen indexen bevatten die zijn gemaakt op berekende kolommen in de tabel.

    • De lidtabellen hebben alle beperkingen voor PRIMAIRE SLEUTEL voor hetzelfde aantal kolommen.

    • Alle lidtabellen in de weergave hebben dezelfde ANSI-opvullingsinstelling. Dit kan worden ingesteld met behulp van de optie gebruikersopties in sp_configure of de SET-instructie.

Voorwaarden voor het wijzigen van gegevens in gepartitioneerde weergaven

De volgende beperkingen gelden voor instructies waarmee gegevens in gepartitioneerde weergaven worden gewijzigd:

  • De INSERT instructie levert waarden voor alle kolommen in de weergave, zelfs als de onderliggende lidtabellen een DEFAULT beperking hebben voor deze kolommen of als ze waarden toestaan NULL . Voor die lidtabelkolommen met DEFAULT definities kunnen de instructies het trefwoord DEFAULTniet expliciet gebruiken.

  • De waarde die in de partitioneringskolom wordt ingevoegd, voldoet aan ten minste één van de onderliggende beperkingen; anders mislukt de invoegactie met een schending van een beperking.

  • UPDATE instructies kunnen het DEFAULT trefwoord niet opgeven als een waarde in de SET component, zelfs als de kolom een DEFAULT waarde heeft die is gedefinieerd in de bijbehorende lidtabel.

  • Kolommen in de weergave die een identiteitskolom in een of meer lidtabellen zijn, kunnen niet worden gewijzigd met behulp van een INSERT of UPDATE meer instructies.

  • Als een van de lidtabellen een tijdstempelkolom bevat, kunnen de gegevens niet worden gewijzigd met behulp van een INSERT of UPDATE meer instructies.

  • Als een van de lidtabellen een trigger of een ON UPDATE CASCADE/SET NULL/SET DEFAULT beperking ON DELETE CASCADE/SET NULL/SET DEFAULT bevat, kan de weergave niet worden gewijzigd.

  • INSERT, UPDATEen DELETE acties voor een gepartitioneerde weergave zijn niet toegestaan als er een self-join is met dezelfde weergave of met een van de lidtabellen in de instructie.

  • Het bulksgewijs importeren van gegevens in een gepartitioneerde weergave wordt niet ondersteund door bcp of instructies BULK INSERTINSERT ... SELECT * FROM OPENROWSET(BULK...) . U kunt echter meerdere rijen invoegen in een gepartitioneerde weergave met behulp van de INSERT-instructie .

    Note

    Als u een gepartitioneerde weergave wilt bijwerken, moet de gebruiker over en INSERTUPDATE machtigingen voor de lidtabellen beschikkenDELETE.

Aanvullende voorwaarden voor gedistribueerde gepartitioneerde weergaven

Voor gedistribueerde gepartitioneerde weergaven (wanneer een of meer lidtabellen extern zijn), zijn de volgende aanvullende voorwaarden van toepassing:

  • Een gedistribueerde transactie wordt gestart om atomiciteit te garanderen op alle knooppunten die worden beïnvloed door de update.

  • Stel de XACT_ABORT SET optie in op voor ONINSERT, UPDATEof DELETE instructies om te werken.

  • Kolommen in externe tabellen van het type smallmoney waarnaar wordt verwezen in een gepartitioneerde weergave, worden toegewezen als geld. Daarom moeten de bijbehorende kolommen (in dezelfde rangschikkelijke positie in de selectielijst) in de lokale tabellen ook van het type geld zijn.

  • Onder databasecompatibiliteitsniveau 110 en hoger worden kolommen in externe tabellen van het type smalldatetime waarnaar wordt verwezen in een gepartitioneerde weergave toegewezen als smalldatetime. Overeenkomende kolommen (in dezelfde rangschikkpositie in de selectielijst) in de lokale tabellen moeten smalldatetime zijn. Dit is een wijziging in het gedrag van eerdere versies van SQL Server waarin kolommen in externe tabellen van het type smalldatetime waarnaar wordt verwezen in een gepartitioneerde weergave worden toegewezen als datum/tijd en de bijbehorende kolommen in lokale tabellen van het type datum/tijd moeten zijn. Zie ALTER DATABASE Compatibility Level (Transact-SQL)voor meer informatie.

  • Een gekoppelde server in de gepartitioneerde weergave kan geen gekoppelde loopbackserver zijn. Dit is een gekoppelde server die verwijst naar hetzelfde exemplaar van SQL Server.

De instelling van de SET ROWCOUNT optie wordt genegeerd voor INSERT, UPDATEen DELETE acties waarbij gepartitioneerde weergaven en externe tabellen kunnen worden bijgewerkt.

Wanneer de lidtabellen en de definitie van de gepartitioneerde weergave aanwezig zijn, bouwt de SQL Server-queryoptimalisatie intelligente plannen die efficiënt gebruikmaken van query's om toegang te krijgen tot gegevens uit lidtabellen. Met de CHECK beperkingsdefinities wijst de queryprocessor de distributie van sleutelwaarden toe aan de lidtabellen. Wanneer een gebruiker een query uitgeeft, vergelijkt de queryprocessor de toewijzing met de waarden die zijn opgegeven in de WHERE component en bouwt een uitvoeringsplan met een minimale hoeveelheid gegevensoverdracht tussen lidservers. Als sommige lidtabellen zich op externe servers bevinden, worden gedistribueerde query's door het exemplaar van SQL Server omgezet, zodat de hoeveelheid gedistribueerde gegevens die moeten worden overgedragen minimaal is.

Overwegingen voor replicatie

Als u gepartitioneerde weergaven wilt maken voor lidtabellen die betrokken zijn bij replicatie, zijn de volgende overwegingen van toepassing:

  • Als de onderliggende tabellen betrokken zijn bij het samenvoegen van replicatie of transactionele replicatie met het bijwerken van abonnementen, moet u ervoor zorgen dat de kolom uniqueidentifier ook wordt opgenomen in de selectielijst.

    Acties INSERT in de gepartitioneerde weergave moeten een NEWID() waarde voor de kolom uniqueidentifier opgeven. Update-acties op basis van de kolom uniqueidentifier moeten worden opgegeven NEWID() als de waarde, omdat het trefwoord DEFAULT niet kan worden gebruikt.

  • De replicatie van updates die met behulp van de weergave worden gemaakt, is hetzelfde als wanneer tabellen in twee verschillende databases worden gerepliceerd: de tabellen worden geleverd door verschillende replicatieagents en de volgorde van de updates wordt niet gegarandeerd.

Permissions

Vereist de machtiging CREATE VIEW in de database en ALTER-machtiging voor het schema waarin de weergave wordt gemaakt.

Examples

In de volgende voorbeelden wordt de AdventureWorks2022 of AdventureWorksDW2022 database gebruikt.

A. CREATE VIEW gebruiken om een weergave te maken

In het volgende voorbeeld wordt een weergave gemaakt met behulp van een SELECT instructie. Een eenvoudige weergave is handig wanneer een combinatie van kolommen vaak wordt opgevraagd. De gegevens uit deze weergave zijn afkomstig uit de HumanResources.Employee tabellen Person.Person van de AdventureWorks2022-database. De gegevens bevatten informatie over naam- en huurdatums voor de werknemers van Adventure Works Cycles. De weergave kan worden gemaakt voor de persoon die verantwoordelijk is voor het bijhouden van zakelijke verjaardagen, maar zonder deze persoon toegang te geven tot alle gegevens in deze tabellen.

CREATE VIEW hiredate_view  
AS
SELECT p.FirstName, p.LastName, e.BusinessEntityID, e.HireDate  
FROM HumanResources.Employee AS e   
JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ;  
GO  

B. GEBRUIKEN MET VERSLEUTELING

In het volgende voorbeeld wordt de WITH ENCRYPTION optie gebruikt en worden berekende kolommen, hernoemde kolommen en meerdere kolommen weergegeven.

Van toepassing op: SQL Server 2008 (10.0.x) en hoger en SQL Database.

CREATE VIEW Purchasing.PurchaseOrderReject  
WITH ENCRYPTION  
AS  
SELECT PurchaseOrderID, ReceivedQty, RejectedQty,   
    RejectedQty / ReceivedQty AS RejectRatio, DueDate  
FROM Purchasing.PurchaseOrderDetail  
WHERE RejectedQty / ReceivedQty > 0  
AND DueDate > CONVERT(DATETIME,'20010630',101) ;  
GO  

C. GEBRUIK MET DE OPTIE CONTROLEREN

In het volgende voorbeeld ziet u een weergave met de naam dbo.SeattleOnly vijf tabellen en kunnen gegevenswijzigingen alleen van toepassing zijn op werknemers die in Seattle wonen.

CREATE VIEW dbo.SeattleOnly  
AS  
SELECT p.LastName, p.FirstName, e.JobTitle, a.City, sp.StateProvinceCode  
FROM HumanResources.Employee e  
INNER JOIN Person.Person p  
ON p.BusinessEntityID = e.BusinessEntityID  
    INNER JOIN Person.BusinessEntityAddress bea   
    ON bea.BusinessEntityID = e.BusinessEntityID   
    INNER JOIN Person.Address a   
    ON a.AddressID = bea.AddressID  
    INNER JOIN Person.StateProvince sp   
    ON sp.StateProvinceID = a.StateProvinceID  
WHERE a.City = 'Seattle'  
WITH CHECK OPTION ;  
GO  

D. Ingebouwde functies in een weergave gebruiken

In het volgende voorbeeld ziet u een weergavedefinitie met een ingebouwde functie. Wanneer u functies gebruikt, moet u een kolomnaam opgeven voor de afgeleide kolom.

CREATE VIEW Sales.SalesPersonPerform  
AS  
SELECT TOP (100) SalesPersonID, SUM(TotalDue) AS TotalSales  
FROM Sales.SalesOrderHeader  
WHERE OrderDate > CONVERT(DATETIME,'20001231',101)  
GROUP BY SalesPersonID;  
GO  

E. Gepartitioneerde gegevens gebruiken

In het volgende voorbeeld worden tabellen met de naam SUPPLY1, SUPPLY2, SUPPLY3en SUPPLY4. Deze tabellen komen overeen met de leverancierstabellen van vier kantoren, gelegen in verschillende regio's.

--Create the tables and insert the values.  
CREATE TABLE dbo.SUPPLY1 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 1 and 150),  
supplier CHAR(50)  
);  
CREATE TABLE dbo.SUPPLY2 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 151 and 300),  
supplier CHAR(50)  
);  
CREATE TABLE dbo.SUPPLY3 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 301 and 450),  
supplier CHAR(50)  
);  
CREATE TABLE dbo.SUPPLY4 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 451 and 600),  
supplier CHAR(50)  
);  
GO  
--Create the view that combines all supplier tables.  
CREATE VIEW dbo.all_supplier_view  
WITH SCHEMABINDING  
AS  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY1  
UNION ALL  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY2  
UNION ALL  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY3  
UNION ALL  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY4;  
GO
INSERT dbo.all_supplier_view VALUES ('1', 'CaliforniaCorp'), ('5', 'BraziliaLtd')    
, ('231', 'FarEast'), ('280', 'NZ')  
, ('321', 'EuroGroup'), ('442', 'UKArchip')  
, ('475', 'India'), ('521', 'Afrique');  
GO  

Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)

F. Een weergave maken door twee tabellen samen te voegen

In het volgende voorbeeld wordt een weergave gemaakt met behulp van een SELECT instructie met een OUTER JOIN. De resultaten van de joinquery vullen de weergave.

CREATE VIEW view1  
AS 
SELECT fis.CustomerKey, fis.ProductKey, fis.OrderDateKey, 
  fis.SalesTerritoryKey, dst.SalesTerritoryRegion  
FROM FactInternetSales AS fis   
LEFT OUTER JOIN DimSalesTerritory AS dst   
ON (fis.SalesTerritoryKey=dst.SalesTerritoryKey);