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

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Crea una tabla virtual cuyo contenido (columnas y filas) se define mediante una consulta.Creates a virtual table whose contents (columns and rows) are defined by a query. Utilice esta instrucción para crear una vista de los datos de una o varias tablas de la base de datos.Use this statement to create a view of the data in one or more tables in the database. Por ejemplo, una vista se puede utilizar para lo siguiente:For example, a view can be used for the following purposes:

  • Para centrar, simplificar y personalizar la percepción de la base de datos para cada usuario.To focus, simplify, and customize the perception each user has of the database.

  • Como mecanismo de seguridad, que permite a los usuarios obtener acceso a los datos por medio de la vista, pero no les conceden el permiso de obtener acceso directo a las tablas base subyacentes de la vista.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.

  • Para proporcionar una interfaz compatible con versiones anteriores para emular una tabla cuyo esquema ha cambiado.To provide a backward compatible interface to emulate a table whose schema has changed.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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

ArgumentosArguments

OR ALTEROR ALTER
Se aplica a: Base de datos SQL de AzureAzure SQL Database y SQL ServerSQL Server (a partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).Applies to: Base de datos SQL de AzureAzure SQL Database and SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).

Altera la vista condicionalmente solo si ya existe.Conditionally alters the view only if it already exists.

schema_nameschema_name
Es el nombre del esquema al que pertenece la vista.Is the name of the schema to which the view belongs.

view_nameview_name
Es el nombre de la vista.Is the name of the view. Los nombres de las vistas deben cumplir las reglas de los identificadores.View names must follow the rules for identifiers. La especificación del nombre del propietario de la vista es opcional.Specifying the view owner name is optional.

columncolumn
Es el nombre que se va a utilizar para una columna en una vista.Is the name to be used for a column in a view. Solo se necesita un nombre de columna cuando una columna proviene de una expresión aritmética, una función o una constante; cuando dos o más columnas puedan tener el mismo nombre, normalmente debido a una combinación; o cuando una columna de una vista recibe un nombre distinto al de la columna de la que proviene.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. Los nombres de columna se pueden asignar también en la instrucción SELECT.Column names can also be assigned in the SELECT statement.

Si no se especifica el parámetro column, las columnas de la vista adquieren los mismos nombres que las columnas de la instrucción SELECT.If column is not specified, the view columns acquire the same names as the columns in the SELECT statement.

Nota

En las columnas de la vista, los permisos de un nombre de columna se aplican mediante una instrucción CREATE VIEW o ALTER VIEW, independientemente del origen de los datos subyacentes.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. Por ejemplo, si se conceden permisos para la columna SalesOrderID en una instrucción CREATE VIEW, una instrucción ALTER VIEW puede denominar a la columna SalesOrderID con un nombre de columna distinto, por ejemplo OrderRef, y seguir teniendo los permisos asociados a la vista que utiliza 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
Especifica las acciones que va a llevar a cabo la vista.Specifies the actions the view is to perform.

select_statementselect_statement
Es la instrucción SELECT que define la vista.Is the SELECT statement that defines the view. Dicha instrucción puede utilizar más de una tabla y otras vistas.The statement can use more than one table and other views. Se necesitan permisos adecuados para seleccionar los objetos a los que se hace referencia en la cláusula SELECT de la vista que se ha creado.Appropriate permissions are required to select from the objects referenced in the SELECT clause of the view that is created.

Una vista no tiene por qué ser un simple subconjunto de filas y de columnas de una tabla determinada.A view does not have to be a simple subset of the rows and columns of one particular table. Es posible crear una vista que utilice más de una tabla u otras vistas mediante una cláusula SELECT de cualquier complejidad.A view can be created that uses more than one table or other views with a SELECT clause of any complexity.

En una definición de vista indizada, la instrucción SELECT debe ser una instrucción de una única tabla o una instrucción JOIN de varias tablas con agregación opcional.In an indexed view definition, the SELECT statement must be a single table statement or a multitable JOIN with optional aggregation.

Las cláusulas SELECT de una definición de vista no pueden incluir lo siguiente:The SELECT clauses in a view definition cannot include the following:

  • Una cláusula ORDER BY, a menos que también haya una cláusula TOP en la lista de selección de la instrucción SELECTAn ORDER BY clause, unless there is also a TOP clause in the select list of the SELECT statement

    Importante

    La cláusula ORDER BY solo se usa para determinar las filas devueltas por la cláusula TOP u OFFSET en la definición de la 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. Esta cláusula no garantiza resultados ordenados cuando se consulte la vista, a menos que también se especifique ORDER BY en la propia consulta.The ORDER BY clause does not guarantee ordered results when the view is queried, unless ORDER BY is also specified in the query itself.

  • La palabra clave INTOThe INTO keyword

  • La cláusula OPTIONThe OPTION clause

  • Una referencia a una tabla temporal o a una variable de tablaA reference to a temporary table or a table variable.

Dado que select_statement utiliza la instrucción SELECT, es válido utilizar <join_hint> y <table_hint> hints como se especifican en la cláusula 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. Para obtener más información, vea FROM (Transact-SQL) y SELECT (Transact-SQL).For more information, see FROM (Transact-SQL) and SELECT (Transact-SQL).

En select_statement se pueden utilizar funciones y varias instrucciones SELECT separadas por UNION o UNION ALL.Functions and multiple SELECT statements separated by UNION or UNION ALL can be used in select_statement.

CHECK OPTIONCHECK OPTION
Fuerza que todas las instrucciones de modificación de datos que se ejecuten en la vista sigan los criterios establecidos en select_statement.Forces all data modification statements executed against the view to follow the criteria set within select_statement. Cuando una fila se modifica mediante una vista, WITH CHECK OPTION garantiza que los datos permanezcan visibles en toda la vista después de confirmar la modificación.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

Cualquier actualización realizada directamente en las tablas subyacentes de una vista no se comprueba en la vista, aunque se haya especificado CHECK OPTION.Any updates performed directly to a view's underlying tables are not verified against the view, even if CHECK OPTION is specified.

ENCRYPTIONENCRYPTION
Se aplica a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

Cifra las entradas de sys.syscomments que contienen el texto de la instrucción CREATE VIEW.Encrypts the entries in sys.syscomments that contain the text of the CREATE VIEW statement. El uso de WITH ENCRYPTION evita que la vista se publique como parte de la replicación de SQL Server.Using WITH ENCRYPTION prevents the view from being published as part of SQL Server replication.

SCHEMABINDINGSCHEMABINDING
Enlaza la vista al esquema de las tablas subyacentes.Binds the view to the schema of the underlying table or tables. Cuando se especifica SCHEMABINDING, las tablas base no se pueden modificar de una forma que afecte a la definición de la vista.When SCHEMABINDING is specified, the base table or tables cannot be modified in a way that would affect the view definition. En primer lugar, se debe modificar o quitar la propia definición de la vista para quitar las dependencias en la tabla que se va a modificar.The view definition itself must first be modified or dropped to remove dependencies on the table that is to be modified. Cuando se usa SCHEMABINDING, select_statement debe incluir los nombres en dos partes (schema.object) de las tablas, las vistas o las funciones definidas por el usuario a las que se hace referencia.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. Todos los objetos a los que se hace referencia se deben encontrar en la misma base de datos.All referenced objects must be in the same database.

Las vistas o las tablas que participan en una vista creada con la cláusula SCHEMABINDING no se pueden quitar a menos que se quite o cambie esa vista de forma que deje de tener un enlace de esquema.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. En caso contrario, Motor de base de datosDatabase Engine genera un error.Otherwise, the Motor de base de datosDatabase Engine raises an error. Además, la ejecución de las instrucciones ALTER TABLE en tablas que participan en vistas que tienen enlaces de esquema provoca un error si estas instrucciones afectan a la definición de la 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
Especifica que la instancia de SQL ServerSQL Server devolverá a las API de DB-Library, ODBC y OLE DB la información de metadatos sobre la vista en vez de las tablas base cuando se soliciten los metadatos del modo de exploración para una consulta que hace referencia a la 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. Los metadatos del modo de exploración son metadatos adicionales que la instancia de SQL ServerSQL Server devuelve a estas API del lado cliente.Browse-mode metadata is additional metadata that the instance of SQL ServerSQL Server returns to these client-side APIs. Estos metadatos permiten a las API del lado cliente implementar cursores del lado cliente actualizables.This metadata enables the client-side APIs to implement updatable client-side cursors. Los metadatos del modo de exploración incluyen información sobre la tabla base a la que pertenecen las columnas del conjunto de resultados.Browse-mode metadata includes information about the base table that the columns in the result set belong to.

Para las vistas creadas con VIEW_METADATA, los metadatos del modo de exploración devuelven el nombre de vista y no los nombres de tablas base cuando describen columnas de la vista en el conjunto de resultados.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.

Cuando se crea una vista mediante WITH VIEW_METADATA, todas sus columnas, excepto una columna timestamp, son actualizables si la vista tiene los desencadenadores 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. Para obtener más información acerca de las vistas actualizables, vea la sección Notas.For more information about updatable views, see Remarks.

NotasRemarks

Una vista solo se puede crear en la base de datos actual.A view can be created only in the current database. CREATE VIEW debe ser la primera instrucción en un lote de consultas.The CREATE VIEW must be the first statement in a query batch. Una vista puede tener un máximo de 1.024 columnas.A view can have a maximum of 1,024 columns.

Cuando se realiza una consulta a través de una vista, el Motor de base de datosDatabase Engine se asegura de que todos los objetos de base de datos a los que se hace referencia en algún lugar de la instrucción existen, que son válidos en el contexto de la instrucción y que las instrucciones de modificación de datos no infringen ninguna regla de integridad de los datos.When querying through a view, the Motor de base de datosDatabase 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. Las comprobaciones que no son correctas devuelven un mensaje de error.A check that fails returns an error message. Las comprobaciones correctas traducen la acción a una acción con las tablas subyacentes.A successful check translates the action into an action against the underlying table or tables.

Si una vista depende de una tabla o vista que se ha quitado, el Motor de base de datosDatabase Engine genera un mensaje de error si alguien trata de utilizar la vista.If a view depends on a table or view that was dropped, the Motor de base de datosDatabase Engine produces an error message when anyone tries to use the view. Si se crea una nueva tabla o vista y la estructura de la tabla no cambia con respecto a la tabla base anterior para sustituir a la eliminada, se puede volver a utilizar la vista.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. Si cambia la estructura de la nueva tabla o vista, es necesario eliminar la vista y volver a crearla.If the new table or view structure changes, the view must be dropped and re-created.

Si una vista no se crea con la cláusula SCHEMABINDING, debe ejecutarse sp_refreshview cuando se realicen cambios en los objetos subyacentes de la vista que afecten a la definición de ésta.If a view is not created with the SCHEMABINDING clause, sp_refreshview should be run when changes are made to the objects underlying the view that affect the definition of the view. De lo contrario, la vista podría producir resultados inesperados en las consultas.Otherwise, the view might produce unexpected results when it is queried.

Cuando se crea una vista, la información sobre ella se almacena en estas vistas de catálogo: sys.views, sys.columns y 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. El texto de la instrucción CREATE VIEW se almacena en la vista de catálogo sys.sql_modules.The text of the CREATE VIEW statement is stored in the sys.sql_modules catalog view.

El resultado de una consulta que utiliza un índice de una vista definido con expresiones numeric o float podría diferir del resultado de una consulta similar que no utiliza el índice de la 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. Esta diferencia se podría deber a errores de redondeo durante las acciones INSERT, DELETE o UPDATE en las tablas subyacentes.This difference may be caused by rounding errors during INSERT, DELETE, or UPDATE actions on underlying tables.

Cuando se crea una vista, el Motor de base de datosDatabase Engine guarda la configuración de SET QUOTED_IDENTIFIER y SET ANSI_NULLS.The Motor de base de datosDatabase Engine saves the settings of SET QUOTED_IDENTIFIER and SET ANSI_NULLS when a view is created. Esta configuración original se utiliza para analizar la vista cuando ésta se utiliza.These original settings are used to parse the view when the view is used. Por tanto, cualquier configuración de sesión de cliente de SET QUOTED_IDENTIFIER y SET ANSI_NULLS no afecta a la definición de la vista cuando se obtiene acceso a ella.Therefore, any client-session settings for SET QUOTED_IDENTIFIER and SET ANSI_NULLS do not affect the view definition when the view is accessed.

Vistas actualizablesUpdatable Views

Es posible modificar los datos de una tabla base subyacente mediante una vista, siempre que se cumplan las siguientes condiciones:You can modify the data of an underlying base table through a view, as long as the following conditions are true:

  • Cualquier modificación, incluidas las instrucciones UPDATE, INSERT y DELETE, debe hacer referencia a las columnas de una única tabla base.Any modifications, including UPDATE, INSERT, and DELETE statements, must reference columns from only one base table.

  • Las columnas que se vayan a modificar en la vista deben hacer referencia directa a los datos subyacentes de las columnas de la tabla.The columns being modified in the view must directly reference the underlying data in the table columns. Las columnas no se pueden obtener de otra forma, como las siguientes:The columns cannot be derived in any other way, such as through the following:

    • Una función de agregado: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR y VARP.An aggregate function: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR, and VARP.

    • Un cálculo.A computation. La columna no se puede calcular a partir de una expresión que utilice otras columnas.The column cannot be computed from an expression that uses other columns. Las columnas formadas mediante los operadores de conjunto UNION, UNION ALL, CROSSJOIN, EXCEPT e INTERSECT equivalen a un cálculo y tampoco son actualizables.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.

  • Las columnas que se van a modificar no se ven afectadas por las cláusulas GROUP BY, HAVING o DISTINCT.The columns being modified are not affected by GROUP BY, HAVING, or DISTINCT clauses.

  • No se utiliza TOP con la cláusula WITH CHECK OPTION en ningún punto de select_statement de la vista.TOP is not used anywhere in the select_statement of the view together with the WITH CHECK OPTION clause.

Las restricciones anteriores se aplican a cualquier subconsulta de la cláusula FROM de la vista, al igual que a la propia vista.The previous restrictions apply to any subqueries in the FROM clause of the view, just as they apply to the view itself. Normalmente, el Motor de base de datosDatabase Engine debe poder realizar un seguimiento sin ambigüedades de las modificaciones de la definición de la vista a una tabla base.Generally, the Motor de base de datosDatabase Engine must be able to unambiguously trace modifications from the view definition to one base table. Para más información, vea Modificar datos mediante una vista.For more information, see Modify Data Through a View.

Si las restricciones anteriores le impiden modificar datos directamente mediante una vista, considere las siguientes opciones:If the previous restrictions prevent you from modifying data directly through a view, consider the following options:

  • Desencadenadores INSTEAD OFINSTEAD OF Triggers

    Es posible crear desencadenadores INSTEAD OF en una vista para que sea actualizable.INSTEAD OF triggers can be created on a view to make a view updatable. El desencadenador INSTEAD OF se ejecuta en lugar de la instrucción de modificación de datos en la que se define el desencadenador.The INSTEAD OF trigger is executed instead of the data modification statement on which the trigger is defined. Este desencadenador permite al usuario especificar el conjunto de acciones que hay que realizar para procesar la instrucción de modificación de datos.This trigger lets the user specify the set of actions that must happen to process the data modification statement. Por lo tanto, si existe un desencadenador INSTEAD OF para una vista en una instrucción de modificación de datos determinada (INSERT, UPDATE o DELETE), la vista correspondiente se puede actualizar mediante esa instrucción.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. Para obtener más información acerca de los desencadenadores INSTEAD OF, vea Desencadenadores DML.For more information about INSTEAD OF triggers, see DML Triggers.

  • Vistas con particionesPartitioned Views

    Si la vista es una vista con particiones, se puede actualizar con determinadas restricciones.If the view is a partitioned view, the view is updatable, subject to certain restrictions. Si es necesario, el Motor de base de datosDatabase Engine distingue las vistas con particiones locales como las vistas en las que todas las tablas participantes y la vista se encuentran en la misma instancia de SQL ServerSQL Server y las vistas con particiones distribuidas como las vistas en las que al menos una de las tablas de la vista reside en otro servidor o en uno remoto.When it is needed, the Motor de base de datosDatabase 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.

Vistas con particionesPartitioned Views

Una vista con particiones es una vista definida por un operador UNION ALL de las tablas miembro estructuradas de la misma manera pero almacenadas en diferentes tablas de la misma instancia de SQL ServerSQL Server o en un grupo de instancias autónomas de servidores de SQL ServerSQL Server denominados servidores de bases de datos federadas.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

El método preferido para la partición de datos local en un servidor es a través de tablas con particiones.The preferred method for partitioning data local to one server is through partitioned tables. Para obtener más información, vea Partitioned Tables and Indexes.For more information, see Partitioned Tables and Indexes.

Si diseña un esquema de partición, debe tener claro qué datos pertenecen a cada partición.In designing a partitioning scheme, it must be clear what data belongs to each partition. Por ejemplo, los datos de la tabla Customers se distribuyen en tres tablas miembro en tres ubicaciones de servidor: Customers_33 en Server1, Customers_66 en Server2 y Customers_99 en 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 con particiones de Server1 se define de la siguiente forma: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;  

Normalmente, se dice que una vista tiene particiones si tiene el siguiente formato: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;  

Condiciones para la creación de vistas con particionesConditions for Creating Partitioned Views

  1. La list de selecciónThe select list

    • Todas las columnas de las tablas miembro deben seleccionarse en la lista de columnas de la definición de la vista.All columns in the member tables should be selected in the column list of the view definition.

    • Las columnas que se encuentren en la misma posición ordinal de cada select list deben ser del mismo tipo, incluidas las intercalaciones.The columns in the same ordinal position of each select list should be of the same type, including collations. No es suficiente que las columnas sean de tipos implícitamente convertibles, como sucede normalmente con UNION.It is not sufficient for the columns to be implicitly convertible types, as is generally the case for UNION.

      Además, al menos una columna (por ejemplo <col>) debe aparecer en todas las listas de selección en la misma posición ordinal.Also, at least one column (for example <col>) must appear in all the select lists in the same ordinal position. Esta columna <col> debe definirse de tal forma que las tablas miembro T1, ..., Tn tengan restricciones CHECK C1, ..., Cn definidas en <col>, respectivamente.This <col> should be defined in a way that the member tables T1, ..., Tn have CHECK constraints C1, ..., Cn defined on <col>, respectively.

      La restricción C1 definida en la tabla T1 debe tener el siguiente formato: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 >  
      
    • Las restricciones deben estar definidas de manera que cualquier valor especificado de <col> pueda cumplir al menos una de las restricciones C1, ..., Cn de modo que las restricciones formen un conjunto de intervalos no combinados o que no se superpongan.The constraints should 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 should form a set of disjointed or nonoverlapping intervals. La columna <col> en la que se definen las restricciones no combinadas se denomina columna de partición.The column <col> on which the disjointed constraints are defined is called the partitioning column. Observe que la columna de partición puede tener diferentes nombres en las tablas subyacentes.Note that the partitioning column may have different names in the underlying tables. Las restricciones deben estar habilitadas y ser de confianza para cumplir las condiciones mencionadas anteriormente de la columna de partición.The constraints should be in an enabled and trusted state for them to meet the previously mentioned conditions of the partitioning column. Si las restricciones están deshabilitadas, vuelva a habilitarlas mediante la opción CHECK CONSTRAINT constraint_name de ALTER TABLE y la opción WITH CHECK para validarlas.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.

      En los siguientes ejemplos se muestran conjuntos válidos de restricciones: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] }  
      
    • No se puede utilizar la misma columna varias veces en la lista de selección.The same column cannot be used multiple times in the select list.

  2. Columna de particiónPartitioning column

    • La columna de partición forma parte de la restricción PRIMARY KEY de la tabla.The partitioning column is a part of the PRIMARY KEY of the table.

    • No puede ser una columna calculada, de identidad, predeterminada o timestamp.It cannot be a computed, identity, default, or timestamp column.

    • Si existe más de una restricción en la misma columna de una tabla miembro, el Motor de base de datos omite todas las restricciones y no las tiene en cuenta al determinar si la vista tiene particiones.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. Para cumplir las condiciones de la vista con particiones, solamente debe existir una restricción de partición en la columna de partición.To meet the conditions of the partitioned view, there should be only one partitioning constraint on the partitioning column.

    • No hay restricciones sobre la posibilidad de actualización de la columna de partición.There are no restrictions on the updatability of the partitioning column.

  3. Tablas miembro o tablas subyacentes T1, ..., TnMember tables, or underlying tables T1, ..., Tn

    • Las tablas pueden ser locales o tablas de otros equipos que ejecuten SQL ServerSQL Server a los que se haga referencia mediante un nombre de cuatro partes o un nombre basado en OPENDATASOURCE u 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 sintaxis de OPENDATASOURCE y OPENROWSET puede especificar un nombre de tabla, pero no una consulta de paso a través.The OPENDATASOURCE and OPENROWSET syntax can specify a table name, but not a pass-through query. Para obtener más información, consulte OPENDATASOURCE (Transact-SQL) y OPENROWSET (Transact-SQL).For more information, see OPENDATASOURCE (Transact-SQL) and OPENROWSET (Transact-SQL).

      Si una o más tablas miembro son remotas, la vista se denomina vista con particiones distribuida y se aplican condiciones adicionales.If one or more of the member tables are remote, the view is called distributed partitioned view, and additional conditions apply. Se describen más adelante en esta sección.They are described later in this section.

    • La misma tabla no puede aparecer dos veces en el conjunto de tablas que se está combinando con la instrucción UNION ALL.The same table cannot appear two times in the set of tables that are being combined with the UNION ALL statement.

    • Las tablas miembro no pueden tener índices creados en columnas calculadas de la tabla.The member tables cannot have indexes created on computed columns in the table.

    • Las tablas miembro deben tener todas las restricciones PRIMARY KEY en el mismo número de columnas.The member tables should have all PRIMARY KEY constraints on the same number of columns.

    • Todas las tablas miembro de la vista deben tener el mismo valor de relleno ANSI.All member tables in the view should have the same ANSI padding setting. Éste se establece mediante la opción user options de sp_configure o la instrucción SET.This can be set by using either the user options option in sp_configure or the SET statement.

Condiciones para la modificación de datos en vistas con particionesConditions for Modifying Data in Partitioned Views

Las siguientes restricciones se aplican a instrucciones que modifican datos en vistas con particiones:The following restrictions apply to statements that modify data in partitioned views:

  • La instrucción INSERT debe proporcionar valores para todas las columnas de la vista, incluso si las tablas miembro subyacentes tienen una restricción DEFAULT para esas columnas o si admiten valores NULL.The INSERT statement must supply 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. En las columnas de la tabla miembro con definiciones DEFAULT, las instrucciones no pueden usar explícitamente la palabra clave DEFAULT.For those member table columns that have DEFAULT definitions, the statements cannot explicitly use the keyword DEFAULT.

  • El valor que se va a insertar en la columna de partición debe cumplir al menos una de las restricciones subyacentes; en caso contrario, la acción de inserción provocará un error con una infracción de restricción.The value being inserted into the partitioning column should satisfy at least one of the underlying constraints; otherwise, the insert action will fail with a constraint violation.

  • Las instrucciones UPDATE no pueden especificar la palabra clave DEFAULT como valor de la cláusula SET, aunque la columna tenga definido un valor DEFAULT en la tabla miembro correspondiente.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.

  • Las columnas de la vista que sean columnas de identidad en una o varias tablas miembro no se pueden modificar mediante una instrucción 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.

  • Si una de las tablas miembro contiene una columna timestamp, los datos no se pueden modificar mediante una instrucción 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.

  • Si una de las tablas miembro contiene un desencadenador o una restricción ON UPDATE CASCADE/SET NULL/SET DEFAULT u ON DELETE CASCADE/SET NULL/SET DEFAULT, no se puede modificar la vista.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.

  • Las acciones INSERT, UPDATE y DELETE en una vista con particiones no están permitidas si hay una autocombinación con la misma vista o con cualquiera de las tablas miembro de la instrucción.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.

  • La importación masiva de datos a una vista con particiones no es compatible con la utilidad bcp ni con las instrucciones 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. Sin embargo, puede insertar varias filas en una vista con particiones utilizando la instrucción INSERT.However, you can insert multiple rows into a partitioned view by using the INSERT statement.

    Nota

    Para actualizar una vista con particiones, el usuario debe tener permisos INSERT, UPDATE y DELETE en las tablas miembro.To update a partitioned view, the user must have INSERT, UPDATE, and DELETE permissions on the member tables.

Condiciones adicionales de las vistas con particiones distribuidasAdditional Conditions for Distributed Partitioned Views

A las vistas con particiones distribuidas (cuando una o varias tablas miembro son remotas) se les aplican las siguientes condiciones adicionales:For distributed partitioned views (when one or more member tables are remote), the following additional conditions apply:

  • Se iniciará una transacción distribuida para garantizar la atomicidad en todos los nodos a los que afecta la actualización.A distributed transaction will be started to guarantee atomicity across all nodes affected by the update.

  • La opción XACT_ABORT SET debe establecerse en ON para que las instrucciones INSERT, UPDATE o DELETE funcionen.The XACT_ABORT SET option should be set to ON for INSERT, UPDATE, or DELETE statements to work.

  • Cualquier columna de las tablas remotas de tipo smallmoney a la que se haga referencia en una vista con particiones se asignará como money.Any columns in remote tables of type smallmoney that are referenced in a partitioned view are mapped as money. Por lo tanto, las columnas correspondientes (en la misma posición ordinal de la lista de selección) de las tablas locales deben ser también de 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.

  • En el nivel 110 y posteriores de compatibilidad de bases de datos, cualquier columna de las tablas remotas de tipo smalldatetime a la que se haga referencia en una vista con particiones se asignará como smalldatetime.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. Las columnas correspondientes (en la misma posición ordinal en la lista de selección) de las tablas locales deben ser smalldatetime.Corresponding columns (in the same ordinal position in the select list) in the local tables must be smalldatetime. Esto representa un cambio de comportamiento con respecto a versiones anteriores de SQL ServerSQL Server, en las que las columnas de tablas remotas de tipo smalldatetime a las que se hace referencia en una vista con particiones se asignan como datetime y las columnas correspondientes de las tablas locales deben ser de 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. Para obtener más información, vea Nivel de compatibilidad de ALTER DATABASE (Transact-SQL).For more information, see ALTER DATABASE Compatibility Level (Transact-SQL).

  • Ningún servidor vinculado de la vista con particiones puede ser un servidor vinculado en bucle de retorno.Any linked server in the partitioned view cannot be a loopback linked server. Se trata de un servidor vinculado que apunta a la misma instancia de SQL ServerSQL Server.This is a linked server that points to the same instance of SQL ServerSQL Server.

El valor de la opción SET ROWCOUNT se pasa por alto para las acciones INSERT, UPDATE y DELETE que implican vistas con particiones y tablas remotas actualizables.The setting of the SET ROWCOUNT option is ignored for INSERT, UPDATE, and DELETE actions that involve updatable partitioned views and remote tables.

Cuando las tablas miembro y la definición de la vista con particiones están preparadas, el optimizador de consultas de SQL ServerSQL Server crea planes inteligentes que utilizan las consultas de forma eficaz para tener acceso a los datos de las tablas miembro.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 las definiciones de la restricción CHECK, el procesador de consultas asigna la distribución de valores clave entre las tablas miembro.With the CHECK constraint definitions, the query processor maps the distribution of key values across the member tables. Cuando un usuario emite una consulta, el procesador de consultas compara la asignación con los valores especificados en la cláusula WHERE y crea un plan de ejecución con una transferencia mínima de datos entre los servidores miembro.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. Por lo tanto, aunque algunas tablas miembro puedan estar ubicadas en servidores remotos, la instancia de SQL ServerSQL Server resuelve las consultas distribuidas de manera que la cantidad de datos distribuidos que haya que transferir sea mínima.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.

Consideraciones acerca de la replicaciónConsiderations for Replication

Para crear vistas con particiones en tablas miembro implicadas en la replicación, deben tenerse en cuenta las consideraciones siguientes:To create partitioned views on member tables that are involved in replication, the following considerations apply:

  • Si las tablas subyacentes intervienen en la replicación de mezcla o en la replicación transaccional con suscripciones de actualización, la columna uniqueidentifier también debe incluirse en la lista de selección.If the underlying tables are involved in merge replication or transactional replication with updating subscriptions, the uniqueidentifier column should also be included in the select list.

    Las acciones INSERT que se ejecutan en la vista con particiones deben proporcionar un valor NEWID() para la columna uniqueidentifier.Any INSERT actions into the partitioned view must provide a NEWID() value for the uniqueidentifier column. Las acciones UPDATE en la columna uniqueidentifier deben proporcionar NEWID() como valor, puesto que no se puede usar la palabra clave DEFAULT.Any UPDATE actions against the uniqueidentifier column must supply NEWID() as the value because the DEFAULT keyword cannot be used.

  • La replicación de actualizaciones que se realiza mediante la vista es igual que cuando las tablas se replican en dos bases de datos distintas: agentes de replicación diferentes dan servicio a las tablas y no se garantiza el orden de las actualizaciones.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.

PermisosPermissions

Se necesita el permiso CREATE VIEW en la base de datos y el permiso ALTER en el esquema en que se crea la vista.Requires CREATE VIEW permission in the database and ALTER permission on the schema in which the view is being created.

EjemplosExamples

Para los siguientes ejemplos se usan las bases de datos AdventureWorks 2012 o AdventureWorksDW.The following examples use the AdventureWorks 2012 or AdventureWorksDW database.

A.A. Usar una instrucción CREATE VIEW sencillaUsing a simple CREATE VIEW

En el ejemplo siguiente se crea una vista mediante una instrucción SELECT sencilla.The following example creates a view by using a simple SELECT statement. Una vista sencilla resulta útil cuando se consulta con frecuencia una combinación de columnas.A simple view is helpful when a combination of columns is queried frequently. Los datos de esta vista provienen de las tablas HumanResources.Employee y Person.Person de la base de datos AdventureWorks2012AdventureWorks2012.The data from this view comes from the HumanResources.Employee and Person.Person tables of the AdventureWorks2012AdventureWorks2012 database. Los datos proporcionan el nombre e información sobre la fecha de contratación de los empleados de Adventure Works CyclesAdventure Works Cycles.The data provides name and hire date information for the employees of Adventure Works CyclesAdventure Works Cycles. Esta vista puede crearse para la persona responsable del seguimiento de los aniversarios de trabajo pero sin concederle acceso a todos los datos de estas tablas.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. Usar WITH ENCRYPTIONUsing WITH ENCRYPTION

En el siguiente ejemplo se utiliza la opción WITH ENCRYPTION y se muestran columnas calculadas, columnas con el nombre cambiado y varias columnas.The following example uses the WITH ENCRYPTION option and shows computed columns, renamed columns, and multiple columns.

Se aplica a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 y SQL DatabaseSQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and SQL DatabaseSQL 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. Usar WITH CHECK OPTIONUsing WITH CHECK OPTION

En el siguiente ejemplo se muestra una vista denominada SeattleOnly que hace referencia a cinco tablas y permite modificar datos aplicados únicamente a los empleados que viven en 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. Usar funciones integradas dentro de una vistaUsing built-in functions within a view

En el siguiente ejemplo se muestra una definición de vista que incluye una función integrada.The following example shows a view definition that includes a built-in function. Al utilizar funciones, es necesario especificar un nombre de columna para la columna derivada.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. Usar datos con particionesUsing partitioned data

En el siguiente ejemplo se utilizan las tablas denominadas SUPPLY1, SUPPLY2, SUPPLY3 y SUPPLY4.The following example uses tables named SUPPLY1, SUPPLY2, SUPPLY3, and SUPPLY4. Estas tablas corresponden a las tablas de proveedores de cuatro oficinas ubicadas en diferentes países o regiones.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  

Ejemplos: Almacenamiento de datos SQLSQL Data Warehouse y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Almacenamiento de datos SQLSQL Data Warehouse and Almacenamiento de datos paralelosParallel Data Warehouse

F.F. Crear una vista simpleCreating a simple view

En el ejemplo siguiente se crea una vista seleccionando solo algunas de las columnas de la tabla de origen.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. Crear una vista mediante la combinación de dos tablasCreate a view by joining two tables

En el ejemplo siguiente se crea una vista mediante una instrucción SELECT con OUTER JOIN.The following example creates a view by using a SELECT statement with an OUTER JOIN. Los resultados de la consulta de combinación rellenan 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);  

Consulte tambiénSee 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)
Crear un procedimiento almacenado 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)