CREATE VIEW (Transact-SQL)CREATE VIEW (Transact-SQL)

SI APPLICA A: sìSQL Server sìDatabase SQL di Azure sìAzure SQL Data Warehouse sìParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Crea una tabella virtuale il cui contenuto (colonne e righe) è definito da una query.Creates a virtual table whose contents (columns and rows) are defined by a query. Utilizzare questa istruzione per creare una vista dei dati in una o più tabelle nel database.Use this statement to create a view of the data in one or more tables in the database. Ad esempio, è possibile utilizzare una vista per gli scopi seguenti:For example, a view can be used for the following purposes:

  • Per analizzare, semplificare e personalizzare la visualizzazione del database per ogni utente.To focus, simplify, and customize the perception each user has of the database.

  • Come meccanismo di sicurezza grazie al quale è possibile consentire agli utenti di accedere ai dati tramite una vista, senza concedere loro le autorizzazioni di accesso alle tabelle di base sottostanti.As a security mechanism by allowing users to access data through the view, without granting the users permissions to directly access the underlying base tables.

  • Per fornire un'interfaccia compatibile con le versioni precedenti con cui emulare una tabella il cui schema è stato modificato.To provide a backward compatible interface to emulate a table whose schema has changed.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

-- Syntax for SQL Server and 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 ]       
}   
-- Syntax for Azure SQL Data Warehouse and 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>  

ArgomentiArguments

OR ALTEROR ALTER
Si applica a: Database SQL di AzureAzure SQL Database e SQL ServerSQL Server (a partire da SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).Applies to: Database SQL di AzureAzure SQL Database and SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).

Modifica in modo condizionale la vista solo se esiste già.Conditionally alters the view only if it already exists.

schema_nameschema_name
Nome dello schema a cui appartiene la vista.Is the name of the schema to which the view belongs.

view_nameview_name
Nome della vista.Is the name of the view. I nomi di vista devono essere conformi alle regole per gli identificatori.View names must follow the rules for identifiers. Il nome del proprietario della vista è facoltativo.Specifying the view owner name is optional.

columncolumn
Nome da assegnare a una colonna della vista.Is the name to be used for a column in a view. Il nome della colonna è necessario solo quando una colonna deriva da un'espressione aritmetica, una funzione o una costante, quando due o più colonne potrebbero altrimenti avere lo stesso nome (in genere a causa di un join) oppure quando a una colonna di una vista viene assegnato un nome diverso rispetto alla colonna da cui deriva.A column name is required only when a column is derived from an arithmetic expression, a function, or a constant; when two or more columns may otherwise have the same name, typically because of a join; or when a column in a view is specified a name different from that of the column from which it is derived. È inoltre possibile assegnare nomi di colonna nell'istruzione SELECT.Column names can also be assigned in the SELECT statement.

Se column viene omesso, le colonne della vista acquisiscono gli stessi nomi delle colonne dell'istruzione SELECT.If column is not specified, the view columns acquire the same names as the columns in the SELECT statement.

Nota

Nelle colonne di una vista, le autorizzazioni assegnate per un nome di colonna rimangono valide tra istruzioni CREATE VIEW e ALTER VIEW, indipendentemente dall'origine dei dati sottostanti.In the columns for the view, the permissions for a column name apply across a CREATE VIEW or ALTER VIEW statement, regardless of the source of the underlying data. Se, ad esempio, vengono concesse autorizzazioni per la colonna SalesOrderID in un'istruzione CREATE VIEW, un'istruzione ALTER VIEW può assegnare alla colonna SalesOrderID un nome diverso, ad esempio OrderRef, e mantenere le autorizzazioni associate alla vista che usa SalesOrderID.For example, if permissions are granted on the SalesOrderID column in a CREATE VIEW statement, an ALTER VIEW statement can name the SalesOrderID column with a different column name, such as OrderRef, and still have the permissions associated with the view using SalesOrderID.

ASAS
Specifica le operazioni che la vista deve eseguire.Specifies the actions the view is to perform.

select_statementselect_statement
Istruzione SELECT che definisce la vista.Is the SELECT statement that defines the view. Nell'istruzione è possibile specificare più di una tabella e altre viste.The statement can use more than one table and other views. Per selezionare gli oggetti a cui viene fatto riferimento nella clausola SELECT della vista creata è necessario disporre di autorizzazioni appropriate.Appropriate permissions are required to select from the objects referenced in the SELECT clause of the view that is created.

Non è necessario che una vista sia un semplice subset delle righe e delle colonne di una tabella specifica.A view does not have to be a simple subset of the rows and columns of one particular table. È possibile creare una vista che utilizza più tabelle o altre viste tramite una clausola SELECT del grado di complessità desiderato.A view can be created that uses more than one table or other views with a SELECT clause of any complexity.

In una definizione di vista indicizzata l'istruzione SELECT deve essere riferita a una sola tabella oppure includere un JOIN tra più tabelle con aggregazioni facoltative.In an indexed view definition, the SELECT statement must be a single table statement or a multitable JOIN with optional aggregation.

Le clausole SELECT utilizzate in una definizione di vista non possono includere gli elementi seguenti:The SELECT clauses in a view definition cannot include the following:

  • Una clausola ORDER BY, a meno che nell'elenco di selezione dell'istruzione SELECT non sia presente anche una clausola TOPAn ORDER BY clause, unless there is also a TOP clause in the select list of the SELECT statement

    Importante

    La clausola ORDER BY viene utilizzata esclusivamente per determinare le righe restituite dalla clausola TOP oppure OFFSET nella definizione della vista.The ORDER BY clause is used only to determine the rows that are returned by the TOP or OFFSET clause in the view definition. La clausola ORDER BY non garantisce risultati ordinati in caso di query sulla vista, a meno che tale clausola non venga specificata anche nella query.The ORDER BY clause does not guarantee ordered results when the view is queried, unless ORDER BY is also specified in the query itself.

  • Parola chiave INTOThe INTO keyword

  • Clausola OPTIONThe OPTION clause

  • Un riferimento a una tabella temporanea o a una variabile di tabellaA reference to a temporary table or a table variable.

Poiché select_statement usa l'istruzione SELECT, è possibile usare gli hint <join_hint> e <table_hint> come specificato nella clausola FROM.Because select_statement uses the SELECT statement, it is valid to use <join_hint> and <table_hint> hints as specified in the FROM clause. Per altre informazioni, vedere FROM (Transact-SQL) e SELECT (Transact-SQL).For more information, see FROM (Transact-SQL) and SELECT (Transact-SQL).

In select_statement è possibile usare funzioni e più istruzioni SELECT separate dall'operatore UNION o UNION ALL.Functions and multiple SELECT statements separated by UNION or UNION ALL can be used in select_statement.

CHECK OPTIONCHECK OPTION
Forza il rispetto del set di criteri specificato in select_statement per tutte le istruzioni di modifica dei dati eseguite sulla vista.Forces all data modification statements executed against the view to follow the criteria set within select_statement. Quando una riga viene modificata tramite una vista, la clausola WITH CHECK OPTION assicura che i dati rimangano visibili nella vista dopo il commit della modifica.When a row is modified through a view, the WITH CHECK OPTION makes sure the data remains visible through the view after the modification is committed.

Nota

Tutti gli aggiornamenti eseguiti direttamente sulle tabelle sottostanti di una vista non vengono verificati in base alla vista, anche se la clausola CHECK OPTION è specificata.Any updates performed directly to a view's underlying tables are not verified against the view, even if CHECK OPTION is specified.

ENCRYPTIONENCRYPTION
Si applica a : da SQL Server 2008SQL Server 2008 fino a SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

Esegue la crittografia delle voci della tabella sys.syscomments contenenti il testo dell'istruzione CREATE VIEW.Encrypts the entries in sys.syscomments that contain the text of the CREATE VIEW statement. Se si utilizza WITH ENCRYPTION, la vista non viene pubblicata nell'ambito della replica di SQL Server.Using WITH ENCRYPTION prevents the view from being published as part of SQL Server replication.

SCHEMABINDINGSCHEMABINDING
Associa la vista allo schema della tabella o delle tabelle sottostanti.Binds the view to the schema of the underlying table or tables. Quando la clausola SCHEMABINDING viene specificata, non è possibile apportare alla tabella o alle tabelle di base modifiche che hanno effetto sulla definizione della vista.When SCHEMABINDING is specified, the base table or tables cannot be modified in a way that would affect the view definition. È necessario prima modificare o eliminare la definizione della vista per rimuovere le dipendenze dalla tabella da modificare.The view definition itself must first be modified or dropped to remove dependencies on the table that is to be modified. Quando si usa SCHEMABINDING, l'argomento select_statement deve includere i nomi composti da due parti (schema . object) delle tabelle, delle viste o delle funzioni definite dall'utente a cui viene fatto riferimento.When you use SCHEMABINDING, the select_statement must include the two-part names (schema.object) of tables, views, or user-defined functions that are referenced. Tutti gli oggetti a cui viene fatto riferimento devono essere presenti nello stesso database.All referenced objects must be in the same database.

Le viste o le tabelle che fanno parte di una vista creata con la clausola SCHEMABINDING non possono essere eliminate, a meno che la vista non venga eliminata o modificata in modo che non sia più associata a uno schema.Views or tables that participate in a view created with the SCHEMABINDING clause cannot be dropped unless that view is dropped or changed so that it no longer has schema binding. In caso contrario, nel Motore di databaseDatabase Engine viene generato un errore.Otherwise, the Motore di databaseDatabase Engine raises an error. Inoltre, l'esecuzione di istruzioni ALTER TABLE su tabelle che fanno parte di viste associate a schema ha esito negativo se tali istruzioni modificano la definizione della vista.Also, executing ALTER TABLE statements on tables that participate in views that have schema binding fail when these statements affect the view definition.

VIEW_METADATAVIEW_METADATA
Specifica che l'istanza di SQL ServerSQL Server dovrà restituire alle API DB-Library, ODBC e OLE DB le informazioni sui metadati relativi alla vista anziché alla tabella o alle tabelle di base quando vengono richiesti metadati in modalità browse per una query che fa riferimento alla vista.Specifies that the instance of SQL ServerSQL Server will return to the DB-Library, ODBC, and OLE DB APIs the metadata information about the view, instead of the base table or tables, when browse-mode metadata is being requested for a query that references the view. I metadati in modalità browse sono metadati aggiuntivi che l'istanza di SQL ServerSQL Server restituisce a queste API sul lato client.Browse-mode metadata is additional metadata that the instance of SQL ServerSQL Server returns to these client-side APIs. Questi metadati consentono alle API sul lato client di implementare cursori sul lato client aggiornabili.This metadata enables the client-side APIs to implement updatable client-side cursors. I metadati in modalità browse includono informazioni sulla tabella di base a cui appartengono le colonne del set di risultati.Browse-mode metadata includes information about the base table that the columns in the result set belong to.

Per le viste create con VIEW_METADATA, i metadati in modalità browse restituiscono il nome della vista anziché i nomi delle tabelle di base nella descrizione delle colonne della vista nel set di risultati.For views created with VIEW_METADATA, the browse-mode metadata returns the view name and not the base table names when it describes columns from the view in the result set.

Quando si crea una vista con la clausola WITH VIEW_METADATA, tutte le relative colonne, escluse quelle di tipo timestamp, sono aggiornabili se la vista include trigger INSTEAD OF INSERT o INSTEAD OF UPDATE.When a view is created by using WITH VIEW_METADATA, all its columns, except a timestamp column, are updatable if the view has INSTEAD OF INSERT or INSTEAD OF UPDATE triggers. Per ulteriori informazioni sulle viste aggiornabili, vedere la sezione Osservazioni.For more information about updatable views, see Remarks.

RemarksRemarks

È possibile creare una vista solo nel database corrente.A view can be created only in the current database. CREATE VIEW deve essere la prima istruzione di un batch di query.The CREATE VIEW must be the first statement in a query batch. Una vista può includere al massimo 1.024 colonne.A view can have a maximum of 1,024 columns.

Quando si esegue una query tramite una vista, Motore di databaseDatabase Engine verifica che tutti gli oggetti di database a cui viene fatto riferimento nell'istruzione esistano e siano validi nel contesto dell'istruzione e che le istruzioni di modifica dei dati non violino le regole di integrità dei dati.When querying through a view, the Motore di databaseDatabase Engine checks to make sure that all the database objects referenced anywhere in the statement exist and that they are valid in the context of the statement, and that data modification statements do not violate any data integrity rules. Se la verifica ha esito negativo, viene visualizzato un messaggio di errore.A check that fails returns an error message. In caso contrario, l'azione viene convertita automaticamente in un'operazione sulla tabella o sulle tabelle sottostanti.A successful check translates the action into an action against the underlying table or tables.

Se si tenta di utilizzare una vista che dipende da una tabella o una vista eliminata, Motore di databaseDatabase Engine visualizza un messaggio di errore.If a view depends on a table or view that was dropped, the Motore di databaseDatabase Engine produces an error message when anyone tries to use the view. Se viene creata una nuova tabella o vista per sostituire quella eliminata e la struttura della nuova tabella non è diversa rispetto alla tabella di base precedente, la vista risulta di nuovo utilizzabile.If a new table or view is created and the table structure does not change from the previous base table to replace the one dropped, the view again becomes usable. Se la struttura della nuova tabella o vista è diversa, la vista deve essere eliminata e ricreata.If the new table or view structure changes, the view must be dropped and re-created.

Se una vista non viene creata con la clausola SCHEMABINDING, eseguire sp_refreshview quando vengono apportate modifiche agli oggetti sottostanti la vista che influiscono sulla definizione di tale vista.If a view is not created with the SCHEMABINDING clause, run sp_refreshview when changes are made to the objects underlying the view that affect the definition of the view. In caso contrario, le query sulla vista possono generare risultati imprevisti.Otherwise, the view might produce unexpected results when it is queried.

Quando si crea una vista, le relative informazioni vengono archiviate nelle viste del catalogo seguenti: sys.views, sys.columns e sys.sql_expression_dependencies.When a view is created, information about the view is stored in the following catalog views: sys.views, sys.columns, and sys.sql_expression_dependencies. Il testo dell'istruzione CREATE VIEW viene archiviato nella vista del catalogo sys.sql_modules.The text of the CREATE VIEW statement is stored in the sys.sql_modules catalog view.

Una query che usa un indice su una vista definita tramite espressioni numeric o float può generare un risultato diverso rispetto a una query simile che non usa l'indice sulla vista.A query that uses an index on a view defined with numeric or float expressions may have a result that is different from a similar query that does not use the index on the view. Tale differenza può essere dovuta a errori di arrotondamento generati durante l'esecuzione di operazioni INSERT, DELETE o UPDATE sulle tabelle sottostanti.This difference may be caused by rounding errors during INSERT, DELETE, or UPDATE actions on underlying tables.

In Motore di databaseDatabase Engine le impostazioni delle opzioni SET QUOTED_IDENTIFIER e SET ANSI_NULLS vengono salvate in fase di creazione di una vista.The Motore di databaseDatabase Engine saves the settings of SET QUOTED_IDENTIFIER and SET ANSI_NULLS when a view is created. Queste impostazioni originali vengono utilizzate per analizzare la vista quando viene utilizzata.These original settings are used to parse the view when the view is used. Pertanto, tutte le impostazioni di sessione del client per SET QUOTED_IDENTIFIER e SET ANSI_NULLS non hanno effetto sulla definizione della vista durante l'accesso alla vista.Therefore, any client-session settings for SET QUOTED_IDENTIFIER and SET ANSI_NULLS do not affect the view definition when the view is accessed.

Viste aggiornabiliUpdatable Views

È possibile modificare i dati di una tabella di base sottostante tramite una vista solo se vengono soddisfatti i requisiti seguenti:You can modify the data of an underlying base table through a view, as long as the following conditions are true:

  • Tutte le modifiche, incluse le istruzioni UPDATE, INSERT e DELETE, devono fare riferimento a colonne di una sola tabella di base.Any modifications, including UPDATE, INSERT, and DELETE statements, must reference columns from only one base table.

  • Le colonne modificate nella vista devono fare riferimento direttamente ai dati sottostanti nelle colonne della tabella.The columns being modified in the view must directly reference the underlying data in the table columns. Le colonne non possono essere derivate in altro modo, ad esempio tramite:The columns cannot be derived in any other way, such as through the following:

    • Una funzione di aggregazione: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR e VARP.An aggregate function: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR, and VARP.

    • Un calcolo.A computation. La colonna non può essere calcolata tramite un'espressione che utilizza altre colonne.The column cannot be computed from an expression that uses other columns. Le colonne create mediante gli operatori sui set UNION, UNION ALL, CROSSJOIN, EXCEPT e INTERSECT sono considerate un calcolo e non sono aggiornabili.Columns that are formed by using the set operators UNION, UNION ALL, CROSSJOIN, EXCEPT, and INTERSECT amount to a computation and are also not updatable.

  • Le colonne da modificare non sono interessate da clausole GROUP BY, HAVING o DISTINCT.The columns being modified are not affected by GROUP BY, HAVING, or DISTINCT clauses.

  • La clausola TOP non può essere usata in tutte le posizioni dell'argomento select_statement della vista in combinazione con la clausola WITH CHECK OPTION.TOP is not used anywhere in the select_statement of the view together with the WITH CHECK OPTION clause.

Le restrizioni sopra indicate sono valide sia per qualsiasi sottoquery nella clausola FROM della vista sia per la vista stessa.The previous restrictions apply to any subqueries in the FROM clause of the view, just as they apply to the view itself. In genere, Motore di databaseDatabase Engine deve essere in grado di tracciare senza ambiguità le modifiche dalla definizione della vista a una tabella di base.Generally, the Motore di databaseDatabase Engine must be able to unambiguously trace modifications from the view definition to one base table. Per altre informazioni, vedere Modificare i dati tramite una vista.For more information, see Modify Data Through a View.

Se le restrizioni sopra indicate non consentono di modificare i dati direttamente tramite una vista, è possibile ricorrere alle soluzioni seguenti:If the previous restrictions prevent you from modifying data directly through a view, consider the following options:

  • Trigger INSTEAD OFINSTEAD OF Triggers

    È possibile creare trigger INSTEAD OF per una vista in modo da renderla aggiornabile.INSTEAD OF triggers can be created on a view to make a view updatable. Questo trigger viene eseguito in sostituzione dell'istruzione di modifica dei dati in cui è definitoThe INSTEAD OF trigger is executed instead of the data modification statement on which the trigger is defined. e consente all'utente di specificare il set di azioni che devono essere eseguite per elaborare l'istruzione di modifica dei dati.This trigger lets the user specify the set of actions that must happen to process the data modification statement. Pertanto, se è disponibile un trigger INSTEAD OF per una vista in un'istruzione di modifica dei dati specifica (INSERT, UPDATE o DELETE), la vista corrispondente risulta aggiornabile tramite l'istruzione.Therefore, if an INSTEAD OF trigger exists for a view on a specific data modification statement (INSERT, UPDATE, or DELETE), the corresponding view is updatable through that statement. Per altre informazioni sui trigger INSTEAD OF, vedere Trigger DML.For more information about INSTEAD OF triggers, see DML Triggers.

  • Viste partizionatePartitioned Views

    Se la vista è partizionata, è aggiornabile ma con particolari restrizioni.If the view is a partitioned view, the view is updatable, subject to certain restrictions. Quando necessario, il Motore di databaseDatabase Engine effettua una distinzione tra viste partizionate locali, ovvero le viste nelle quali tutte le tabelle coinvolte e la vista stessa si trovano nella stessa istanza di SQL ServerSQL Server, e viste partizionate distribuite, ovvero le viste nelle quali almeno una tabella della vista risiede in un server diverso o remoto.When it is needed, the Motore di databaseDatabase Engine distinguishes local partitioned views as the views in which all participating tables and the view are on the same instance of SQL ServerSQL Server, and distributed partitioned views as the views in which at least one of the tables in the view resides on a different or remote server.

Viste partizionatePartitioned Views

Una vista partizionata è una vista definita tramite un'istruzione UNION ALL eseguita su tabelle membro con la stessa struttura, ma archiviate separatamente sotto forma di più tabelle nello stessa istanza di SQL ServerSQL Server oppure in un gruppo di istanze autonome di server SQL ServerSQL Server denominato federazione di server di database.A partitioned view is a view defined by a UNION ALL of member tables structured in the same way, but stored separately as multiple tables in either the same instance of SQL ServerSQL Server or in a group of autonomous instances of SQL ServerSQL Server servers, called federated database servers.

Nota

Il metodo consigliato per il partizionamento locale dei dati in un server prevede l'utilizzo di tabelle partizionate.The preferred method for partitioning data local to one server is through partitioned tables. Per ulteriori informazioni, vedere Partitioned Tables and Indexes.For more information, see Partitioned Tables and Indexes.

Durante la progettazione di uno schema di partizione, è necessario individuare con chiarezza i dati appartenenti a ogni partizione.In designing a partitioning scheme, it must be clear what data belongs to each partition. Ad esempio, i dati della tabella Customers vengono distribuiti in tre tabelle membro su tre server: Customers_33 su Server1, Customers_66 su Server2 e Customers_99 su Server3.For example, the data for the Customers table is distributed in three member tables in three server locations: Customers_33 on Server1, Customers_66 on Server2, and Customers_99 on Server3.

Una vista partizionata in Server1 viene definita nel modo seguente:A partitioned view on Server1 is defined in the following way:

--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;  

In generale, una vista viene definita partizionata se utilizza il formato seguente:Generally, a view is said to be a partitioned view if it is of the following form:

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

Requisiti per la creazione di viste partizionateConditions for Creating Partitioned Views

  1. Elenchi di selezione (select list)The select list

    • Nell'elenco di colonne della definizione della vista, selezionare tutte le colonne nelle tabelle membro.In the column list of the view definition, select all columns in the member tables.

    • Assicurarsi che le colonne nella stessa posizione ordinale in ogni oggetto select list siano dello stesso tipo, incluse le regole di confronto.Ensure that the columns in the same ordinal position of each select list are of the same type, including collations. Non è sufficiente che il tipo di dati delle colonne supporti la conversione implicita, come nel caso di operazioni UNION.It is not sufficient for the columns to be implicitly convertible types, as is generally the case for UNION.

      Inoltre, è necessario che almeno una colonna, ad esempio <col>, sia presente in tutti gli elenchi di selezione nella stessa posizione ordinale.Also, at least one column (for example <col>) must appear in all the select lists in the same ordinal position. Definire <col> in modo che le tabelle membro T1, ..., Tn abbiano, rispettivamente, vincoli CHECK C1, ..., Cn definiti in <col>.Define <col> in a way that the member tables T1, ..., Tn have CHECK constraints C1, ..., Cn defined on <col>, respectively.

      Il vincolo C1 definito nella tabella T1 deve avere il formato seguente:Constraint C1 defined on table T1 must be of the following form:

      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 >  
      
    • I vincoli devono essere tali per cui qualsiasi valore di <col> specificato possa soddisfare al massimo uno dei vincoli C1, ..., Cn, in modo che i vincoli formino un set di intervalli disgiunti o non sovrapposti.The constraints must be in such a way that any specified value of <col> can satisfy, at most, one of the constraints C1, ..., Cn so that the constraints form a set of disjointed or nonoverlapping intervals. La colonna <col> in cui sono definiti i vincoli disgiunti è denominata colonna di partizionamento.The column <col> on which the disjointed constraints are defined is called the partitioning column. Si noti che nelle tabelle sottostanti tale colonna può avere nomi diversi.Note that the partitioning column may have different names in the underlying tables. Per soddisfare le condizioni precedenti della colonna di partizionamento, i vincoli devono essere abilitati e attendibili.The constraints must be in an enabled and trusted state for them to meet the previously mentioned conditions of the partitioning column. Se i vincoli sono disabilitati, è necessario riabilitare il controllo dei vincoli tramite l'opzione CHECK CONSTRAINT constraint_name dell'istruzione ALTER TABLE e convalidarli tramite l'opzione WITH CHECK.If the constraints are disabled, re-enable constraint checking by using the CHECK CONSTRAINT constraint_name option of ALTER TABLE, and using the WITH CHECK option to validate them.

      Negli esempi seguenti vengono illustrati alcuni set di vincoli validi:The following examples show valid sets of constraints:

      { [col < 10], [col between 11 and 20] , [col > 20] }  
      { [col between 11 and 20], [col between 21 and 30], [col between 31 and 100] }  
      
    • Nell'elenco di selezione non è consentito utilizzare più volte la stessa colonna.The same column cannot be used multiple times in the select list.

  2. Colonna di partizionamentoPartitioning column

    • Deve fare parte della colonna PRIMARY KEY della tabella.The partitioning column is a part of the PRIMARY KEY of the table.

    • Non può essere una colonna calcolata, Identity, predefinita o timestamp.It cannot be a computed, identity, default, or timestamp column.

    • Se una colonna di una tabella membro ha più vincoli, vengono ignorati tutti i vincoli, anche quando è necessario determinare se la vista è partizionata.If there is more than one constraint on the same column in a member table, the Database Engine ignores all the constraints and does not consider them when determining whether the view is a partitioned view. Per soddisfare le condizioni della vista partizionata, assicurarsi che ci sia un solo vincolo di partizionamento nella colonna di partizionamento.To meet the conditions of the partitioned view, ensure that there is only one partitioning constraint on the partitioning column.

    • Non sono previste restrizioni per quanto concerne l'aggiornabilità della colonna di partizionamento.There are no restrictions on the updatability of the partitioning column.

  3. Tabelle membro o tabelle sottostanti T1, ..., TnMember tables, or underlying tables T1, ..., Tn

    • Possono essere tabelle locali o tabelle presenti in altri computer che eseguono SQL ServerSQL Server a cui viene fatto riferimento tramite un nome composto da quattro parti oppure un nome basato su OPENDATASOURCE o OPENROWSET.The tables can be either local tables or tables from other computers that are running SQL ServerSQL Server that are referenced either through a four-part name or an OPENDATASOURCE- or OPENROWSET-based name. La sintassi di OPENDATASOURCE e OPENROWSET consente di specificare un nome di tabella, ma non una query pass-through.The OPENDATASOURCE and OPENROWSET syntax can specify a table name, but not a pass-through query. Per altre informazioni, vedere OPENDATASOURCE (Transact-SQL) e OPENROWSET (Transact-SQL).For more information, see OPENDATASOURCE (Transact-SQL) and OPENROWSET (Transact-SQL).

      Se una o più tabelle membro sono remote, la vista viene definita vista partizionata distribuita ed è necessario rispettare alcuni ulteriori requisitiIf one or more of the member tables are remote, the view is called distributed partitioned view, and additional conditions apply. descritti di seguito in questa sezione.They are described later in this section.

    • Non è possibile inserire una stessa tabella due volte nel set di tabelle combinate tramite l'istruzione UNION ALL.The same table cannot appear two times in the set of tables that are being combined with the UNION ALL statement.

    • Le tabelle membro non possono includere indici creati su colonne calcolate della tabella.The member tables cannot have indexes created on computed columns in the table.

    • Le tabelle membro hanno i vincoli PRIMARY KEY nello stesso numero di colonne.The member tables have all PRIMARY KEY constraints on the same number of columns.

    • Tutte le tabelle membro della vista hanno la stessa impostazione di riempimento ANSI.All member tables in the view have the same ANSI padding setting. Questa impostazione può essere configurata tramite l'opzione user options della stored procedure sp_configure oppure tramite l'istruzione SET.This can be set by using either the user options option in sp_configure or the SET statement.

Requisiti per la modifica dei dati in viste partizionateConditions for Modifying Data in Partitioned Views

Le istruzioni che modificano i dati in viste partizionate sono soggette alle restrizioni seguenti:The following restrictions apply to statements that modify data in partitioned views:

  • L'istruzione INSERT fornisce valori per tutte le colonne della vista, anche se le tabelle membro sottostanti hanno un vincolo DEFAULT per tali colonne o ammettono valori Null.The INSERT statement supplies values for all the columns in the view, even if the underlying member tables have a DEFAULT constraint for those columns or if they allow for null values. Per le colonne delle tabelle membro che includono definizioni DEFAULT, nelle istruzioni non è consentito specificare la parola chiave DEFAULT in modo esplicito.For those member table columns that have DEFAULT definitions, the statements cannot explicitly use the keyword DEFAULT.

  • Il valore inserito nella colonna di partizionamento soddisfa almeno uno dei vincoli sottostanti. In caso contrario, l'operazione di inserimento provoca una violazione di vincolo e ha esito negativo.The value being inserted into the partitioning column satisfies at least one of the underlying constraints; otherwise, the insert action will fail with a constraint violation.

  • Nelle istruzioni UPDATE non è possibile specificare la parola chiave DEFAULT come valore nella clausola SET, anche se alla colonna è associato un valore DEFAULT definito nella tabella membro corrispondente.UPDATE statements cannot specify the DEFAULT keyword as a value in the SET clause, even if the column has a DEFAULT value defined in the corresponding member table.

  • Le colonne Identity della vista incluse in una o più tabelle membro non possono essere modificate tramite un'istruzione INSERT o UPDATE.Columns in the view that are an identity column in one or more of the member tables cannot be modified by using an INSERT or UPDATE statement.

  • Se una delle tabelle membro include una colonna di tipo timestamp, non è possibile modificare i dati tramite un'istruzione INSERT o UPDATE.If one of the member tables contains a timestamp column, the data cannot be modified by using an INSERT or UPDATE statement.

  • Se una delle tabelle membro include un trigger oppure un vincolo ON UPDATE CASCADE/SET NULL/SET DEFAULT o ON DELETE CASCADE/SET NULL/SET DEFAULT, la vista non può essere modificata.If one of the member tables contains a trigger or an ON UPDATE CASCADE/SET NULL/SET DEFAULT or ON DELETE CASCADE/SET NULL/SET DEFAULT constraint, the view cannot be modified.

  • Le operazioni INSERT, UPDATE e DELETE eseguite su una vista partizionata non sono consentite se includono un self join con tale vista o con una delle tabelle membro.INSERT, UPDATE, and DELETE actions against a partitioned view are not allowed if there is a self-join with the same view or with any of the member tables in the statement.

  • L'importazione in blocco di dati in una vista partizionata non è supportata da bcp o dalle istruzioni BULK INSERT e INSERT... SELECT * FROM OPENROWSET(BULK...).Bulk importing data into a partitioned view is unsupported by bcp or the BULK INSERT and INSERT ... SELECT * FROM OPENROWSET(BULK...) statements. È tuttavia possibile inserire più righe in una vista partizionata usando l'istruzione INSERT.However, you can insert multiple rows into a partitioned view by using the INSERT statement.

    Nota

    Per aggiornare una vista partizionata, l'utente deve disporre delle autorizzazioni INSERT, UPDATE e DELETE per le tabelle membro.To update a partitioned view, the user must have INSERT, UPDATE, and DELETE permissions on the member tables.

Requisiti aggiuntivi per le viste partizionate distribuiteAdditional Conditions for Distributed Partitioned Views

Per le viste partizionate distribuite, ovvero le viste nelle quali una o più tabelle membro sono remote, devono essere soddisfatti i requisiti aggiuntivi seguenti:For distributed partitioned views (when one or more member tables are remote), the following additional conditions apply:

  • Per garantire l'atomicità in tutti i nodi interessati dall'aggiornamento, viene avviata una transazione distribuita.A distributed transaction will be started to guarantee atomicity across all nodes affected by the update.

  • Per consentire il corretto funzionamento delle istruzioni INSERT, UPDATE o DELETE, impostare l'opzione XACT_ABORT SET su ON.Set the XACT_ABORT SET option to ON for INSERT, UPDATE, or DELETE statements to work.

  • Per tutte le colonne delle tabelle remote di tipo smallmoney a cui viene fatto riferimento in una vista partizionata viene eseguito il mapping come money.Any columns in remote tables of type smallmoney that are referenced in a partitioned view are mapped as money. Pertanto, anche le colonne corrispondenti delle tabelle locali, ovvero le colonne che occupano la stessa posizione ordinale nell'elenco di selezione, devono essere di tipo money.Therefore, the corresponding columns (in the same ordinal position in the select list) in the local tables must also be of type money.

  • Con il livello di compatibilità del database 110 o superiore, viene eseguito il mapping come smalldatetime di tutte le colonne delle tabelle remote di tipo smalldatetime a cui viene fatto riferimento in una vista partizionata.Under database compatibility level 110 and higher, any columns in remote tables of type smalldatetime that are referenced in a partitioned view are mapped as smalldatetime. Le colonne corrispondenti delle tabelle locali, ovvero le colonne che occupano la stessa posizione ordinale nell'elenco di selezione, devono essere di tipo smalldatetime.Corresponding columns (in the same ordinal position in the select list) in the local tables must be smalldatetime. Questo comportamento differisce dalle versioni precedenti di SQL ServerSQL Server in cui viene eseguito il mapping come datetime di tutte le colonne delle tabelle remote di tipo smalldatetime a cui viene fatto riferimento in una vista partizionata e le colonne corrispondenti delle tabelle locali devono essere di tipo datetime.This is a change in behavior from earlier versions of SQL ServerSQL Server in which any columns in remote tables of type smalldatetime that are referenced in a partitioned view are mapped as datetime and corresponding columns in local tables must be of type datetime. Per altre informazioni, vedere Livello di compatibilità ALTER DATABASE (Transact-SQL).For more information, see ALTER DATABASE Compatibility Level (Transact-SQL).

  • Qualsiasi server collegato nella vista partizionata non può essere di tipo loopback,Any linked server in the partitioned view cannot be a loopback linked server. ovvero non deve puntare alla stessa istanza di SQL ServerSQL Server.This is a linked server that points to the same instance of SQL ServerSQL Server.

L'impostazione dell'opzione SET ROWCOUNT viene ignorata per le operazioni INSERT, UPDATE e DELETE che coinvolgono viste partizionate aggiornabili e tabelle remote.The setting of the SET ROWCOUNT option is ignored for INSERT, UPDATE, and DELETE actions that involve updatable partitioned views and remote tables.

Quando sono disponibili le tabelle membro e la definizione della vista partizionata, nell'utilità Query Optimizer di SQL ServerSQL Server vengono compilati automaticamente piani appropriati in cui le query vengono utilizzate in modo efficiente per l'accesso ai dati di tabelle membro.When the member tables and partitioned view definition are in place, the SQL ServerSQL Server query optimizer builds intelligent plans that use queries efficiently to access data from member tables. Con le definizioni di vincoli CHECK, in Query Processor viene eseguito il mapping della distribuzione dei valori chiave nelle tabelle membro.With the CHECK constraint definitions, the query processor maps the distribution of key values across the member tables. Quando un utente inoltra una query, viene eseguito un confronto tra il mapping e i valori specificati nella clausola WHERE, quindi viene compilato un piano di esecuzione che comporta il trasferimento di una quantità minima di dati tra i server membri.When a user issues a query, the query processor compares the map to the values specified in the WHERE clause, and builds an execution plan with a minimal amount of data transfer between member servers. Sebbene sia possibile che alcune tabelle membro si trovino in server remoti, le query distribuite vengono risolte dall'istanza di SQL ServerSQL Server in modo che la quantità di dati distribuiti da trasferire sia minima.Therefore, although some member tables may be located in remote servers, the instance of SQL ServerSQL Server resolves distributed queries so that the amount of distributed data that has to be transferred is minimal.

Requisiti per la replicaConsiderations for Replication

Per creare viste partizionate di tabelle membro coinvolte nella replica, devono essere soddisfatti i requisiti seguenti:To create partitioned views on member tables that are involved in replication, the following considerations apply:

  • Se le tabelle sottostanti sono coinvolte nella replica transazionale o di tipo merge con sottoscrizioni aggiornabili, assicurarsi che nell'elenco di selezione sia presente anche la colonna uniqueidentifier.If the underlying tables are involved in merge replication or transactional replication with updating subscriptions, ensure that the uniqueidentifier column is also included in the select list.

    Le operazioni INSERT eseguite nella vista partizionata devono specificare un valore NEWID() per la colonna uniqueidentifier.Any INSERT actions into the partitioned view must provide a NEWID() value for the uniqueidentifier column. Le operazioni UPDATE eseguite sulla colonna uniqueidentifier devono specificare il valore NEWID() in quanto non è possibile usare la parola chiave DEFAULT.Any UPDATE actions against the uniqueidentifier column must supply NEWID() as the value because the DEFAULT keyword cannot be used.

  • La replica di aggiornamenti tramite la vista equivale alla replica di tabelle in due database distinti, ovvero le tabelle vengono gestite da agenti di replica diversi e l'ordine degli aggiornamenti non è prevedibile.The replication of updates made by using the view is the same as when tables are replicated in two different databases: the tables are served by different replication agents and the order of the updates is not guaranteed.

AutorizzazioniPermissions

Sono richieste l'autorizzazione CREATE VIEW per il database e l'autorizzazione ALTER per lo schema in cui viene creata la vista.Requires CREATE VIEW permission in the database and ALTER permission on the schema in which the view is being created.

EsempiExamples

Negli esempi seguenti vengono usati i database AdventureWorks 2012 o AdventureWorksDW.The following examples use the AdventureWorks 2012 or AdventureWorksDW database.

A.A. Utilizzo di un'istruzione CREATE VIEW sempliceUsing a simple CREATE VIEW

Nell'esempio seguente viene creata una vista tramite l'utilizzo di un'istruzione SELECT semplice.The following example creates a view by using a simple SELECT statement. Una vista semplice risulta utile quando vengono eseguite query frequenti su una combinazione di colonne.A simple view is helpful when a combination of columns is queried frequently. I dati di questa vista derivano dalle tabelle HumanResources.Employee e Person.Person del database AdventureWorks2012AdventureWorks2012.The data from this view comes from the HumanResources.Employee and Person.Person tables of the AdventureWorks2012AdventureWorks2012 database. I dati contengono informazioni sul nome e la data di assunzione dei dipendenti di Adventure Works CyclesAdventure Works Cycles.The data provides name and hire date information for the employees of Adventure Works CyclesAdventure Works Cycles. È possibile creare la vista per la persona incaricata di tenere traccia del periodo di assunzione dei dipendenti, senza però consentire a tale utente di accedere a tutti i dati di queste tabelle.The view could be created for the person in charge of tracking work anniversaries but without giving this person access to all the data in these tables.

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

B.B. Utilizzo della clausola WITH ENCRYPTIONUsing WITH ENCRYPTION

Nell'esempio seguente viene utilizzata l'opzione WITH ENCRYPTION e vengono illustrate colonne calcolate, colonne rinominate e più colonne.The following example uses the WITH ENCRYPTION option and shows computed columns, renamed columns, and multiple columns.

Si applica a : da SQL Server 2008SQL Server 2008 fino a SQL Server 2017SQL Server 2017 e Database SQLSQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Database SQLSQL 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.C. Utilizzo della clausola WITH CHECK OPTIONUsing WITH CHECK OPTION

Nell'esempio seguente viene illustrata una vista denominata SeattleOnly che fa riferimento a cinque tabelle e consente di applicare modifiche ai dati solo per i dipendenti che risiedono a Seattle.The following example shows a view named SeattleOnly that references five tables and allows for data modifications to apply only to employees who live in Seattle.

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.D. Utilizzo di funzioni predefinite in una vistaUsing built-in functions within a view

Nell'esempio seguente viene illustrata una definizione di vista che include una funzione predefinita.The following example shows a view definition that includes a built-in function. Quando si utilizzano le funzioni, è necessario specificare un nome di colonna per la colonna derivata.When you use functions, you must specify a column name for the derived column.

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.E. Utilizzo di dati partizionatiUsing partitioned data

Nell'esempio seguente vengono utilizzate le tabelle denominate SUPPLY1, SUPPLY2, SUPPLY3 e SUPPLY4,The following example uses tables named SUPPLY1, SUPPLY2, SUPPLY3, and SUPPLY4. corrispondenti alle tabelle dei fornitori di quattro uffici dislocati in aree geografiche diverse.These tables correspond to the supplier tables from four offices, located in different countries/regions.

--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  

Esempi: SQL Data WarehouseSQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: SQL Data WarehouseSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

F.F. Creazione di una vista sempliceCreating a simple view

Nell'esempio seguente viene creata una vista selezionando solo alcune colonne della tabella di origine.The following example creates a view by selecting only some of the columns from the source table.

CREATE VIEW DimEmployeeBirthDates AS  
SELECT FirstName, LastName, BirthDate   
FROM DimEmployee;  

G.G. Creare una vista creando un join di due tabelleCreate a view by joining two tables

Nell'esempio seguente viene creata una vista tramite un'istruzione SELECT semplice con un elemento OUTER JOIN.The following example creates a view by using a SELECT statement with an OUTER JOIN. I risultati della query join popolano la vista.The results of the join query populate the view.

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);  

Vedere ancheSee Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
ALTER VIEW (Transact-SQL) ALTER VIEW (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
DROP VIEW (Transact-SQL) DROP VIEW (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
Creazione di una stored procedure Create a Stored Procedure
sys.dm_sql_referenced_entities (Transact-SQL) sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities (Transact-SQL) sys.dm_sql_referencing_entities (Transact-SQL)
sp_help (Transact-SQL) sp_help (Transact-SQL)
sp_helptext (Transact-SQL) sp_helptext (Transact-SQL)
sp_refreshview (Transact-SQL) sp_refreshview (Transact-SQL)
sp_rename (Transact-SQL) sp_rename (Transact-SQL)
sys.views (Transact-SQL) sys.views (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
EVENTDATA (Transact-SQL)EVENTDATA (Transact-SQL)