CREATE PARTITION FUNCTION (Transact-SQL)CREATE PARTITION FUNCTION (Transact-SQL)

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

Crea una función en la base de datos actual que asigna las filas de una tabla o un índice a particiones según los valores de una columna especificada.Creates a function in the current database that maps the rows of a table or index into partitions based on the values of a specified column. El uso de CREATE PARTITION FUNCTION constituye el primer paso para la creación de una tabla o un índice con particiones.Using CREATE PARTITION FUNCTION is the first step in creating a partitioned table or index. En SQL Server 2017SQL Server 2017, una tabla o un índice puede tener un máximo de 15.000 particiones.In SQL Server 2017SQL Server 2017, a table or index can have a maximum of 15,000 partitions.

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

SintaxisSyntax

CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )  
AS RANGE [ LEFT | RIGHT ]   
FOR VALUES ( [ boundary_value [ ,...n ] ] )   
[ ; ]  

ArgumentosArguments

partition_function_namepartition_function_name
Es el nombre de la función de partición.Is the name of the partition function. Los nombres de las funciones de partición deben ser únicos en la base de datos y ajustarse a las reglas para los identificadores.Partition function names must be unique within the database and comply with the rules for identifiers.

input_parameter_typeinput_parameter_type
Es el tipo de datos de la columna utilizada para la partición.Is the data type of the column used for partitioning. Todos los tipos de datos son válidos para su uso como columnas de partición, excepto text, ntext, image, xml, timestamp, varchar(max), nvarchar(max), varbinary(max), tipos de datos de alias o tipos de datos definidos por el usuario CLR.All data types are valid for use as partitioning columns, except text, ntext, image, xml, timestamp, varchar(max), nvarchar(max), varbinary(max), alias data types, or CLR user-defined data types.

La columna en sí, conocida como columna de partición, se especifica en la instrucción CREATE TABLE o CREATE INDEX.The actual column, known as a partitioning column, is specified in the CREATE TABLE or CREATE INDEX statement.

boundary_valueboundary_value
Especifica los valores de límite para cada partición de una tabla o un índice con particiones que utiliza partition_function_name.Specifies the boundary values for each partition of a partitioned table or index that uses partition_function_name. Si boundary_value está vacío, la función de partición asigna la tabla o el índice completos utilizando partition_function_name a una sola partición.If boundary_value is empty, the partition function maps the whole table or index using partition_function_name into a single partition. Solo es posible utilizar una columna de partición, especificada en una instrucción CREATE TABLE o CREATE INDEX.Only one partitioning column, specified in a CREATE TABLE or CREATE INDEX statement, can be used.

boundary_value es una expresión constante que puede hacer referencia a variables.boundary_value is a constant expression that can reference variables. Éstas incluyen variables o funciones de tipo definido por el usuario y funciones definidas por el usuario.This includes user-defined type variables, or functions and user-defined functions. No pueden hacer referencia a expresiones de Transact-SQLTransact-SQL.It cannot reference Transact-SQLTransact-SQL expressions. boundary_value debe coincidir con el tipo de datos proporcionado en input_parameter_type o ser susceptible de convertirse de forma implícita a él, y no se puede truncar durante la conversión implícita de forma que el tamaño y la escala del valor no coincidan con el de su input_parameter_type correspondiente.boundary_value must either match or be implicitly convertible to the data type supplied in input_parameter_type, and cannot be truncated during implicit conversion in a way that the size and scale of the value does not match that of its corresponding input_parameter_type.

Nota

Si boundary_value está compuesto por los literales datetime o smalldatetime, estos se evalúan suponiendo que el idioma de la sesión sea us_english.If boundary_value consists of datetime or smalldatetime literals, these literals are evaluated assuming that us_english is the session language. Este comportamiento se ha desaprobado.This behavior is deprecated. Para asegurarse de que la definición de la función de partición se comporta según lo esperado en todos los idiomas de la sesión, se recomienda usar constantes que se interpreten de la misma forma en todas las configuraciones de idioma, como el formato aaaammdd; o bien, convierta literales de forma explícita a un estilo específico.To make sure the partition function definition behaves as expected for all session languages, we recommend that you use constants that are interpreted the same way for all language settings, such as the yyyymmdd format; or explicitly convert literals to a specific style. Para determinar el idioma de la sesión del servidor, ejecute SELECT @@LANGUAGE.To determine the language session of your server, run SELECT @@LANGUAGE.

Para obtener más información, vea Conversión no determinista de las cadenas de fecha literales en valores DATE.For more information, see Nondeterministic conversion of literal date strings into DATE values.

...n...n
Especifica el número de valores proporcionados por boundary_value, que no puede superar 14 999.Specifies the number of values supplied by boundary_value, not to exceed 14,999. El número de particiones creadas es igual a n + 1.The number of partitions created is equal to n + 1. Los valores no se tienen que enumerar en orden.The values do not have to be listed in order. Si los valores no están en orden, Motor de base de datosDatabase Engine los ordena, crea la función y muestra una advertencia para indicar que los valores proporcionados no estaban en orden.If the values are not in order, the Motor de base de datosDatabase Engine sorts them, creates the function, and returns a warning that the values are not provided in order. Si n incluye valores duplicados, el motor de base de datos devuelve un error.The Database Engine returns an error if n includes any duplicate values.

LEFT | RIGHTLEFT | RIGHT
Especifica el lado de cada intervalo de valores de límite, derecho o izquierdo, al que pertenece boundary_value [ ,...n ], cuando Motor de base de datosDatabase Engine ordena los valores del intervalo en orden ascendente de izquierda a derecha.Specifies to which side of each boundary value interval, left or right, the boundary_value [ ,...n ] belongs, when interval values are sorted by the Motor de base de datosDatabase Engine in ascending order from left to right. Si no se especifica, el valor predeterminado es LEFT.If not specified, LEFT is the default.

NotasRemarks

El ámbito de una función de partición está limitado a la base de datos en la que se crea.The scope of a partition function is limited to the database that it is created in. Dentro de la base de datos, las funciones de partición residen en un espacio de nombres independiente de las demás funciones.Within the database, partition functions reside in a separate namespace from the other functions.

Las filas cuya columna de partición tenga valores NULL se colocan en la partición situada más a la izquierda, a menos que se especifique NULL como un valor de límite y se indique RIGHT.Any rows whose partitioning column has null values are placed in the left-most partition, unless NULL is specified as a boundary value and RIGHT is indicated. En este caso, la partición situada más a la izquierda es una partición vacía y los valores NULL se colocan en la siguiente.In this case, the left-most partition is an empty partition, and NULL values are placed in the following partition.

PermisosPermissions

Para ejecutar CREATE PARTITION FUNCTION, se puede utilizar cualquiera de los siguientes permisos:Any one of the following permissions can be used to execute CREATE PARTITION FUNCTION:

  • Permiso ALTER ANY DATASPACE.ALTER ANY DATASPACE permission. De forma predeterminada, este permiso corresponde a los miembros del rol fijo de servidor sysadmin y a los roles fijos de base de datos db_owner y db_ddladmin .This permission defaults to members of the sysadmin fixed server role and the db_owner and db_ddladmin fixed database roles.

  • Permiso CONTROL o ALTER en la base de datos en la que se está creando la función de partición.CONTROL or ALTER permission on the database in which the partition function is being created.

  • Permiso CONTROL SERVER o ALTER ANY DATABASE en el servidor de la base de datos en la que se está creando la función de partición.CONTROL SERVER or ALTER ANY DATABASE permission on the server of the database in which the partition function is being created.

EjemplosExamples

A.A. Crear una función de partición RANGE LEFT en una columna intCreating a RANGE LEFT partition function on an int column

La siguiente función de partición realizará cuatro particiones en una tabla o un índice.The following partition function will partition a table or index into four partitions.

CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES (1, 100, 1000);  

En la tabla siguiente se muestra cómo se crearían particiones en una tabla que usa esta función de partición en la columna de partición col1.The following table shows how a table that uses this partition function on partitioning column col1 would be partitioned.

ParticiónPartition 11 22 33 44
ValoresValues col1 <= 1col1 <= 1 col1 > 1 AND col1 <= 100col1 > 1 AND col1 <= 100 col1 > 100 AND col1 <=1000col1 > 100 AND col1 <=1000 col1 > 1000col1 > 1000

b.B. Crear una función de partición RANGE RIGHT en una columna intCreating a RANGE RIGHT partition function on an int column

La siguiente función de partición utiliza los mismos valores para boundary_value [ ,...n ] que el ejemplo anterior, con la excepción de que especifica RANGE RIGHT.The following partition function uses the same values for boundary_value [ ,...n ] as the previous example, except it specifies RANGE RIGHT.

CREATE PARTITION FUNCTION myRangePF2 (int)  
AS RANGE RIGHT FOR VALUES (1, 100, 1000);  

En la tabla siguiente se muestra cómo se crearían particiones en una tabla que usa esta función de partición en la columna de partición col1.The following table shows how a table that uses this partition function on partitioning column col1 would be partitioned.

ParticiónPartition 11 22 33 44
ValoresValues col1 < 1col1 < 1 col1 >= 1 AND col1 < 100col1 >= 1 AND col1 < 100 col1 >= 100 AND col1 < 1000col1 >= 100 AND col1 < 1000 col1 >= 1000col1 >= 1000

C.C. Crear una función de partición RANGE RIGHT en una columna datetimeCreating a RANGE RIGHT partition function on a datetime column

La siguiente función de partición divide una tabla o un índice en 12 particiones, una para cada mes de un año natural de valores en una columna datetime.The following partition function partitions a table or index into 12 partitions, one for each month of a year's worth of values in a datetime column.

CREATE PARTITION FUNCTION [myDateRangePF1] (datetime)  
AS RANGE RIGHT FOR VALUES ('20030201', '20030301', '20030401',  
               '20030501', '20030601', '20030701', '20030801',   
               '20030901', '20031001', '20031101', '20031201');  

En la tabla siguiente se muestra cómo se crearían particiones en una tabla o un índice que usa esta función de partición en la columna de partición datecol.The following table shows how a table or index that uses this partition function on partitioning column datecol would be partitioned.

ParticiónPartition 11 22 ... 1111 1212
ValoresValues datecol < February 1, 2003datecol < February 1, 2003 datecol >= February 1, 2003 AND datecol < March 1, 2003datecol >= February 1, 2003 AND datecol < March 1, 2003 datecol >= November 1, 2003 AND col1 < December 1, 2003datecol >= November 1, 2003 AND col1 < December 1, 2003 datecol >= December 1, 2003datecol >= December 1, 2003

D.D. Crear una función de partición en una columna charCreating a partition function on a char column

La siguiente función de partición realiza cuatro particiones en una tabla o un índice.The following partition function partitions a table or index into four partitions.

CREATE PARTITION FUNCTION myRangePF3 (char(20))  
AS RANGE RIGHT FOR VALUES ('EX', 'RXE', 'XR');  

En la tabla siguiente se muestra cómo se crearían particiones en una tabla que usa esta función de partición en la columna de partición col1.The following table shows how a table that uses this partition function on partitioning column col1 would be partitioned.

ParticiónPartition 11 22 33 44
ValoresValues col1 < EX...col1 < EX... col1 >= EX AND col1 < RXE...col1 >= EX AND col1 < RXE... col1 >= RXE AND col1 < XR...col1 >= RXE AND col1 < XR... col1 >= XRcol1 >= XR

E.E. Crear 15.000 particionesCreating 15,000 partitions

La siguiente función de partición realiza 15.000 particiones en una tabla o un índice.The following partition function partitions a table or index into 15,000 partitions.

--Create integer partition function for 15,000 partitions.  
DECLARE @IntegerPartitionFunction nvarchar(max) = 
    N'CREATE PARTITION FUNCTION IntegerPartitionFunction (int) 
    AS RANGE RIGHT FOR VALUES (';  
DECLARE @i int = 1;  
WHILE @i < 14999  
BEGIN  
SET @IntegerPartitionFunction += CAST(@i as nvarchar(10)) + N', ';  
SET @i += 1;  
END  
SET @IntegerPartitionFunction += CAST(@i as nvarchar(10)) + N');';  
EXEC sp_executesql @IntegerPartitionFunction;  
GO  

F.F. Crear particiones para varios añosCreating partitions for multiple years

La siguiente función de partición realizará 50 particiones en una tabla o un índice en una columna datetime2.The following partition function partitions a table or index into 50 partitions on a datetime2 column. Hay una partición para cada mes entre enero de 2007 y enero de 2011.There is one partitions for each month between January 2007 and January 2011.

--Create date partition function with increment by month.  
DECLARE @DatePartitionFunction nvarchar(max) = 
    N'CREATE PARTITION FUNCTION DatePartitionFunction (datetime2) 
    AS RANGE RIGHT FOR VALUES (';  
DECLARE @i datetime2 = '20070101';  
WHILE @i < '20110101'  
BEGIN  
SET @DatePartitionFunction += '''' + CAST(@i as nvarchar(10)) + '''' + N', ';  
SET @i = DATEADD(MM, 1, @i);  
END  
SET @DatePartitionFunction += '''' + CAST(@i as nvarchar(10))+ '''' + N');';  
EXEC sp_executesql @DatePartitionFunction;  
GO  

Consulte tambiénSee Also

Tablas e índices con particiones Partitioned Tables and Indexes
$PARTITION (Transact-SQL) $PARTITION (Transact-SQL)
ALTER PARTITION FUNCTION (Transact-SQL) ALTER PARTITION FUNCTION (Transact-SQL)
DROP PARTITION FUNCTION (Transact-SQL) DROP PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL) CREATE PARTITION SCHEME (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
CREATE INDEX (Transact-SQL) CREATE INDEX (Transact-SQL)
ALTER INDEX (Transact-SQL) ALTER INDEX (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sys.partition_functions (Transact-SQL) sys.partition_functions (Transact-SQL)
sys.partition_parameters (Transact-SQL) sys.partition_parameters (Transact-SQL)
sys.partition_range_values (Transact-SQL) sys.partition_range_values (Transact-SQL)
sys.partitions (Transact-SQL) sys.partitions (Transact-SQL)
sys.tables (Transact-SQL) sys.tables (Transact-SQL)
sys.indexes (Transact-SQL) sys.indexes (Transact-SQL)
sys.index_columns (Transact-SQL)sys.index_columns (Transact-SQL)