Seleccionar las filas que se van a migrar mediante una función de filtro (Stretch Database)Select rows to migrate by using a filter function (Stretch Database)

SE APLICA A: síSQL Server (solo Windows a partir de 2016) noAzure SQL Database noAzure Synapse Analytics (SQL DW) noAlmacenamiento de datos paralelosAPPLIES TO: yesSQL Server (Windows only starting with 2016) noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Si almacena los datos inactivos en una tabla independiente, puede configurar Stretch Database para migrar toda la tabla.If you store cold data in a separate table, you can configure Stretch Database to migrate the entire table. Por otro lado, si la tabla contiene datos activos e inactivos, puede especificar un predicado de filtro para seleccionar las filas que se migrarán.If your table contains both hot and cold data, on the other hand, you can specify a filter predicate to select the rows to migrate. El predicado de filtro es una función insertada con valores de tabla.The filter predicate is an inline table-valued function. En este artículo se describe cómo escribir una función insertada con valores de tabla para seleccionar las filas que se migrarán.This article describes how to write an inline table-valued function to select rows to migrate.

Importante

Si se indica una función de filtro que tiene un rendimiento bajo, la migración de datos también tendrá un rendimiento bajo.If you provide a filter function that performs poorly, data migration also performs poorly. Stretch Database aplica la función de filtro a la tabla mediante el operador CROSS APPLY.Stretch Database applies the filter function to the table by using the CROSS APPLY operator.

Si no se especifica una función de filtro, se migrará toda la tabla.If you don't specify a filter function, the entire table is migrated.

Cuando se ejecuta el Asistente para habilitar base de datos para Stretch, es posible migrar toda una tabla o especificar una función de filtro simple en el asistente.When you run the Enable Database for Stretch Wizard, you can migrate an entire table or you can specify a simple filter function in the wizard. Si quiere usar un tipo de función de filtro diferente para seleccionar las filas que va a migrar, realice una de las siguientes acciones.If you want to use a different type of filter function to select rows to migrate, do one of the following things.

  • Salga del asistente y ejecute la instrucción ALTER TABLE para habilitar Stretch para la tabla y especificar una función de filtro.Exit the wizard and run the ALTER TABLE statement to enable Stretch for the table and to specify a filter function.

  • Ejecute la instrucción ALTER TABLE para especificar una función de filtro después de salir del asistente.Run the ALTER TABLE statement to specify a filter function after you exit the wizard.

Más adelante en este artículo se describe la sintaxis de ALTER TABLE para agregar una función.The ALTER TABLE syntax for adding a function is described later in this article.

Requisitos básicos para la función de filtroBasic requirements for the filter function

La función insertada con valores de tabla necesaria para un predicado de Stretch Database es parecida al ejemplo siguiente.The inline table-valued function required for a Stretch Database filter predicate looks like the following example.

CREATE FUNCTION dbo.fn_stretchpredicate(@column1 datatype1, @column2 datatype2 [, ...n])  
RETURNS TABLE  
WITH SCHEMABINDING   
AS   
RETURN  SELECT 1 AS is_eligible  
        WHERE <predicate>  

Los parámetros para la función deben ser identificadores para las columnas de la tabla.The parameters for the function have to be identifiers for columns from the table.

Los enlaces de esquema son necesarios para impedir que se eliminen o modifiquen las columnas que usa la función de filtro.Schema binding is required to prevent columns that are used by the filter function from being dropped or altered.

Valor devueltoReturn value

Si la función devuelve un resultado que no está vacío, la fila será apta para la migración.If the function returns a non-empty result, the row is eligible to be migrated. De lo contrario, si la función no devuelve ningún resultado, la fila no será apta para la migración.Otherwise - that is, if the function doesn't return a result - the row is not eligible to be migrated.

CondicionesConditions

El <predicado> puede constar de una condición o de varias condiciones unidas con el operador lógico AND.The <predicate> can consist of one condition, or of multiple conditions joined with the AND logical operator.

<predicate> ::= <condition> [ AND <condition> ] [ ...n ]  

A su vez, cada condición puede constar de una condición primitiva o de varias condiciones primitivas unidas con el operador lógico OR.Each condition in turn can consist of one primitive condition, or of multiple primitive conditions joined with the OR logical operator.

<condition> ::= <primitive_condition> [ OR <primitive_condition> ] [ ...n ]  

Condiciones primitivasPrimitive conditions

Una condición primitiva permite realizar una de las comparaciones siguientes.A primitive condition can do one of the following comparisons.

<primitive_condition> ::=   
{  
<function_parameter> <comparison_operator> constant  
| <function_parameter> { IS NULL | IS NOT NULL }  
| <function_parameter> IN ( constant [ ,...n ] )  
}  
  
  • Comparar un parámetro de función con una expresión constante.Compare a function parameter to a constant expression. Por ejemplo, @column1 < 1000.For example, @column1 < 1000.

    En este ejemplo se comprueba si el valor de una columna fecha es < 1/1/2016.Here's an example that checks whether the value of a date column is < 1/1/2016.

    CREATE FUNCTION dbo.fn_stretchpredicate(@column1 datetime)  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
            WHERE @column1 < CONVERT(datetime, '1/1/2016', 101)  
    GO  
    
    ALTER TABLE stretch_table_name SET ( REMOTE_DATA_ARCHIVE = ON (  
        FILTER_PREDICATE = dbo.fn_stretchpredicate(date),  
        MIGRATION_STATE = OUTBOUND  
    ) )  
    
    
  • Aplicar el operador IS NULL o IS NOT NULL a un parámetro de función.Apply the IS NULL or IS NOT NULL operator to a function parameter.

  • Utilizar el operador IN para comparar un parámetro de función con una lista de valores constantes.Use the IN operator to compare a function parameter to a list of constant values.

    En este ejemplo se comprueba si el valor de una columna estado_envío es IN (N'Completed', N'Returned', N'Cancelled').Here's an example that checks whether the value of a shipment_status column is IN (N'Completed', N'Returned', N'Cancelled').

    CREATE FUNCTION dbo.fn_stretchpredicate(@column1 nvarchar(15))  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
            WHERE @column1 IN (N'Completed', N'Returned', N'Cancelled')  
    GO  
    
    ALTER TABLE table1 SET ( REMOTE_DATA_ARCHIVE = ON (  
        FILTER_PREDICATE = dbo.fn_stretchpredicate(shipment_status),  
        MIGRATION_STATE = OUTBOUND  
    ) )  
    
    

Operadores de comparaciónComparison operators

Se admiten los siguientes operadores de comparación.The following comparison operators are supported.

<, <=, >, >=, =, <>, !=, !<, !>

<comparison_operator> ::= { < | <= | > | >= | = | <> | != | !< | !> }  

Expresiones constantesConstant expressions

Las constantes que se usan en una función de filtro pueden ser cualquier expresión determinista que se puede evaluar cuando se define la función.The constants that you use in a filter function can be any deterministic expression that can be evaluated when you define the function. Las expresiones constantes pueden contener lo siguiente.Constant expressions can contain the following things.

  • Literales.Literals. Por ejemplo, N'abc', 123.For example, N'abc', 123.

  • Expresiones algebraicas.Algebraic expressions. Por ejemplo, 123 + 456.For example, 123 + 456.

  • Funciones deterministas.Deterministic functions. Por ejemplo, SQRT(900).For example, SQRT(900).

  • Conversiones deterministas con CAST o CONVERT.Deterministic conversions that use CAST or CONVERT. Por ejemplo, CONVERT(datetime, '1/1/2016', 101).For example, CONVERT(datetime, '1/1/2016', 101).

Otras expresionesOther expressions

Se pueden usar los operadores BETWEEN y NOT BETWEEN si la función resultante cumple las reglas descritas aquí después de reemplazar los operadores BETWEEN y NOT BETWEEN por las expresiones AND y OR equivalentes.You can use the BETWEEN and NOT BETWEEN operators if the resulting function conforms to the rules described here after you replace the BETWEEN and NOT BETWEEN operators with the equivalent AND and OR expressions.

No se pueden utilizar subconsultas o funciones no deterministas como RAND() o GETDATE().You can't use subqueries or non-deterministic functions such as RAND() or GETDATE().

Agregar una función de filtro a una tablaAdd a filter function to a table

Agregue una función de filtro a una tabla ejecutando la instrucción ALTER TABLE y especificando una función insertada con valores de tabla existente como valor del parámetro FILTER_PREDICATE .Add a filter function to a table by running the ALTER TABLE statement and specifying an existing inline table-valued function as the value of the FILTER_PREDICATE parameter. Por ejemplo:For example:

ALTER TABLE stretch_table_name SET ( REMOTE_DATA_ARCHIVE = ON (  
    FILTER_PREDICATE = dbo.fn_stretchpredicate(column1, column2),  
    MIGRATION_STATE = <desired_migration_state>  
) )  
  

Después de enlazar la función a la tabla como predicado, las siguientes afirmaciones son verdaderas.After you bind the function to the table as a predicate, the following things are true.

  • La próxima vez que se produzca una migración de datos, solo se migrarán las filas para las que la función devuelva un valor que no esté vacío.The next time data migration occurs, only the rows for which the function returns a non-empty value are migrated.

  • Las columnas utilizadas por la función son columnas enlazadas a un esquema.The columns used by the function are schema bound. Estas columnas no se podrán modificar mientras una tabla utilice la función como su predicado de filtro.You can't alter these columns as long as a table is using the function as its filter predicate.

La función insertada con valores de tabla no se podrá eliminar mientras una tabla utilice la función como su predicado de filtro.You can't drop the inline table-valued function as long as a table is using the function as its filter predicate.

Sugerencia

Para mejorar el rendimiento de la función de filtro, cree un índice en las columnas que usa la función.To improve the performance of the filter function, create an index on the columns used by the function.

Pasar nombres de columna a la función de filtroPassing column names to the filter function

Al asignar una función de filtro a una tabla, especifique los nombres de columna que se pasan a la función de filtro con un nombre compuesto por una sola parte.When you assign a filter function to a table, specify the column names passed to the filter function with a one-part name. Si especifica un nombre con tres partes cuando pase los nombres de columna, se producirá un error en las consultas posteriores en la tabla habilitada para Stretch.If you specify a three-part name when you pass the column names, subsequent queries against the Stretch-enabled table will fail.

Por ejemplo, si especifica un nombre de columna con tres partes, como se muestra en el ejemplo siguiente, la instrucción se ejecutará correctamente, pero se producirá un error en las consultas posteriores en la tabla.For example, if you specify a three-part column name as shown in the following example, the statement will run successfully, but subsequent queries against the table will fail.

ALTER TABLE SensorTelemetry 
  SET ( REMOTE_DATA_ARCHIVE = ON (
    FILTER_PREDICATE=dbo.fn_stretchpredicate(dbo.SensorTelemetry.ScanDate),
    MIGRATION_STATE = OUTBOUND )
  )

En su lugar, debe especificar la función de filtro con un nombre de columna compuesto por una sola parte, tal como se muestra en el ejemplo siguiente.Instead, specify the filter function with a one-part column name as shown in the following example.

ALTER TABLE SensorTelemetry 
  SET ( REMOTE_DATA_ARCHIVE = ON  (
    FILTER_PREDICATE=dbo.fn_stretchpredicate(ScanDate),
    MIGRATION_STATE = OUTBOUND )
  )

Agregar una función de filtro después de ejecutar el asistenteAdd a filter function after running the Wizard

Si quiere usar una función que no se puede crear en el Asistente para habilitar base de datos para Stretch , puede ejecutar la instrucción ALTER TABLE para especificar una función después de salir del asistente.If you want use a function that you can't create in the Enable Database for Stretch Wizard, you can run the ALTER TABLE statement to specify a function after you exit the wizard. No obstante, antes de aplicar una función, tendrá que detener la migración de datos que ya está en curso y devolver los datos migrados.Before you can apply a function, however, you have to stop the data migration that's already in progress and bring back migrated data. (Para obtener más información en la que se explica por qué esto es necesario, vea Reemplazar una función de filtro existente).(For more info about why this is necessary, see Replace an existing filter function.)

  1. Invierta la dirección de la migración y devuelva los datos ya migrados.Reverse the direction of migration and bring back the data already migrated. Una vez que se haya iniciado esta operación, no se puede cancelar.You can't cancel this operation after it starts. Además, incurrirá en costos en Azure para realizar las transferencias de datos de salida.You also incur costs on Azure for outbound data transfers (egress). Para obtener más información, vea los detalles de los precios de Azure.For more info, see How Azure pricing works.

    ALTER TABLE <table name>  
        SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;   
    
  2. Espere a que finalice la migración.Wait for migration to finish. Puede comprobar el estado en Stretch Database Monitor en SQL Server Management Studio, o bien puede consultar la vista sys.dm_db_rda_migration_status .You can check the status in Stretch Database Monitor from SQL Server Management Studio, or you can query the sys.dm_db_rda_migration_status view. Para obtener más información, vea Supervisión y solución de problemas de migración de datos o sys.dm_db_rda_migration_status.For more info, see Monitor and troubleshoot data migration or sys.dm_db_rda_migration_status.

  3. Cree la función de filtro que quiere aplicar a la tabla.Create the filter function that you want to apply to the table.

  4. Agregue la función a la tabla y reinicie la migración de datos a Azure.Add the function to the table and restart data migration to Azure.

    ALTER TABLE <table name>  
        SET ( REMOTE_DATA_ARCHIVE  
            (           
                FILTER_PREDICATE = <predicate>,  
                MIGRATION_STATE = OUTBOUND  
            )  
            );   
    

Filtrar filas por fechaFilter rows by date

En el ejemplo siguiente se migran filas en las que la columna fecha contiene un valor anterior al 1 de enero de 2016.The following example migrates rows where the date column contains a value earlier than January 1, 2016.

-- Filter by date  
--  
CREATE FUNCTION dbo.fn_stretch_by_date(@date datetime2)  
RETURNS TABLE  
WITH SCHEMABINDING   
AS   
       RETURN SELECT 1 AS is_eligible WHERE @date < CONVERT(datetime2, '1/1/2016', 101)  
GO  
  

Filtrar filas por el valor de la columna de estadoFilter rows by the value in a status column

En el ejemplo siguiente se migran filas en las que la columna estado contiene uno de los valores especificados.The following example migrates rows where the status column contains one of the specified values.

-- Filter by status column  
--  
CREATE FUNCTION dbo.fn_stretch_by_status(@status nvarchar(128))  
RETURNS TABLE  
WITH SCHEMABINDING   
AS   
       RETURN SELECT 1 AS is_eligible WHERE @status IN (N'Completed', N'Returned', N'Cancelled')  
GO  
  

Filtrar filas mediante una ventana deslizanteFilter rows by using a sliding window

Para filtrar filas mediante una ventana deslizante, tenga en cuenta los requisitos siguientes para la función de filtro.To filter rows by using a sliding window, keep in mind the following requirements for the filter function.

  • La función debe ser determinista.The function has to be deterministic. Por lo tanto, no se puede crear una función que actualice automáticamente la ventana deslizante con el paso del tiempo.Therefore you can't create a function that automatically recalculates the sliding window as time passes.

  • La función usa enlaces de esquema.The function uses schema binding. Por lo tanto, no se puede simplemente actualizar la función "en contexto" cada día llamando a ALTER FUNCTION para mover la ventana deslizante.Therefore you can't simply update the function "in place" every day by calling ALTER FUNCTION to move the sliding window.

Empiece con una función de filtro parecida al ejemplo siguiente, que migra las filas en las que la columna systemEndTime contiene un valor anterior al 1 de enero de 2016.Start with a filter function like the following example, which migrates rows where the systemEndTime column contains a value earlier than January 1, 2016.

CREATE FUNCTION dbo.fn_StretchBySystemEndTime20160101(@systemEndTime datetime2)   
RETURNS TABLE   
WITH SCHEMABINDING    
AS    
RETURN SELECT 1 AS is_eligible   
  WHERE @systemEndTime < CONVERT(datetime2, '2016-01-01T00:00:00', 101) ;  
  

Aplique la función de filtro a la tabla.Apply the filter function to the table.

ALTER TABLE <table name>   
SET (   
        REMOTE_DATA_ARCHIVE = ON   
                (   
                        FILTER_PREDICATE = dbo.fn_StretchBySystemEndTime20160101(SysEndTime)  
                                , MIGRATION_STATE = OUTBOUND   
                )  
        )   
;  
  

Para actualizar la ventana deslizante, proceda del modo siguiente.When you want to update the sliding window, do the following things.

  1. Cree una nueva función que especifique la nueva ventana deslizante.Create a new function that specifies the new sliding window. En el ejemplo siguiente se seleccionan fechas anteriores al 2 de enero de 2016, en lugar del 1 de enero de 2016.The following example selects dates earlier than January 2, 2016, instead of January 1, 2016.

  2. Reemplace la función de filtro anterior por la nueva llamando a ALTER TABLE, como se muestra en el ejemplo siguiente.Replace the previous filter function with the new one by calling ALTER TABLE, as shown in the following example.

  3. Opcionalmente, puede eliminar la función de filtro anterior que ya no utiliza llamando a DROP FUNCTION.Optionally, drop the previous filter function that you're no longer using by calling DROP FUNCTION. (Este paso no se muestra en el ejemplo).(This step is not shown in the example.)

BEGIN TRAN  
GO  
        /*(1) Create new predicate function definition */  
        CREATE FUNCTION dbo.fn_StretchBySystemEndTime20160102(@systemEndTime datetime2)  
        RETURNS TABLE  
        WITH SCHEMABINDING   
        AS   
        RETURN SELECT 1 AS is_eligible  
               WHERE @systemEndTime < CONVERT(datetime2,'2016-01-02T00:00:00', 101)  
        GO  
  
        /*(2) Set the new function as the filter predicate */  
        ALTER TABLE <table name>  
        SET   
        (  
               REMOTE_DATA_ARCHIVE = ON  
               (  
                       FILTER_PREDICATE = dbo.fn_StretchBySystemEndTime20160102(SysEndTime),  
                       MIGRATION_STATE = OUTBOUND  
               )  
        )   
COMMIT ;  
  

Más ejemplos de funciones de filtro válidasMore examples of valid filter functions

  • En el ejemplo siguiente se combinan dos condiciones primitivas con el operador lógico AND.The following example combines two primitive conditions by using the AND logical operator.

    CREATE FUNCTION dbo.fn_stretchpredicate((@column1 datetime, @column2 nvarchar(15))  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
      WHERE @column1 < N'20150101' AND @column2 IN (N'Completed', N'Returned', N'Cancelled')  
    GO  
    
    ALTER TABLE table1 SET ( REMOTE_DATA_ARCHIVE = ON (  
        FILTER_PREDICATE = dbo.fn_stretchpredicate(date, shipment_status),  
        MIGRATION_STATE = OUTBOUND  
    ) )  
    
    
  • En el ejemplo siguiente se utilizan varias condiciones y una conversión determinista con CONVERT.The following example uses several conditions and a deterministic conversion with CONVERT.

    CREATE FUNCTION dbo.fn_stretchpredicate_example1(@column1 datetime, @column2 int, @column3 nvarchar)  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
        WHERE @column1 < CONVERT(datetime, '1/1/2015', 101) AND (@column2 < -100 OR @column2 > 100 OR @column2 IS NULL) AND @column3 IN (N'Completed', N'Returned', N'Cancelled')  
    GO  
    
    
  • En el ejemplo siguiente se utilizan funciones y operadores matemáticos.The following example uses mathematical operators and functions.

    CREATE FUNCTION dbo.fn_stretchpredicate_example2(@column1 float)  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
            WHERE @column1 < SQRT(400) + 10  
    GO  
    
    
  • En el ejemplo siguiente se utilizan los operadores BETWEEN y NOT BETWEEN.The following example uses the BETWEEN and NOT BETWEEN operators. Este uso es válido porque la función resultante cumple las reglas descritas aquí después de reemplazar los operadores BETWEEN y NOT BETWEEN por las expresiones AND y OR equivalentes.This usage is valid because the resulting function conforms to the rules described here after you replace the BETWEEN and NOT BETWEEN operators with the equivalent AND and OR expressions.

    CREATE FUNCTION dbo.fn_stretchpredicate_example3(@column1 int, @column2 int)  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
            WHERE @column1 BETWEEN 0 AND 100  
                AND (@column2 NOT BETWEEN 200 AND 300 OR @column1 = 50)  
    GO  
    
    

    La función anterior es equivalente a la función siguiente después de reemplazar los operadores BETWEEN y NOT BETWEEN por las expresiones AND y OR equivalentes.The preceding function is equivalent to the following function after you replace the BETWEEN and NOT BETWEEN operators with the equivalent AND and OR expressions.

    CREATE FUNCTION dbo.fn_stretchpredicate_example4(@column1 int, @column2 int)  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
            WHERE @column1 >= 0 AND @column1 <= 100 AND (@column2 < 200 OR @column2 > 300 OR @column1 = 50)  
    GO  
    
    

Ejemplos de funciones de filtro no válidasExamples of filter functions that aren't valid

  • La función siguiente no es válida porque contiene una conversión no determinista.The following function isn't valid because it contains a non-deterministic conversion.

    CREATE FUNCTION dbo.fn_example5(@column1 datetime)  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
            WHERE @column1 < CONVERT(datetime, '1/1/2016')  
    GO  
    
    
  • La función siguiente no es válida porque contiene una llamada de función no determinista.The following function isn't valid because it contains a non-deterministic function call.

    CREATE FUNCTION dbo.fn_example6(@column1 datetime)  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
            WHERE @column1 < DATEADD(day, -60, GETDATE())  
    GO  
    
    
  • La función siguiente no es válida porque contiene una subconsulta.The following function isn't valid because it contains a subquery.

    CREATE FUNCTION dbo.fn_example7(@column1 int)  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
            WHERE @column1 IN (SELECT SupplierID FROM Supplier WHERE Status = 'Defunct')  
    GO  
    
    
  • Las funciones siguientes no son válidas porque las expresiones que utilizan operadores algebraicos o funciones integradas se deben evaluar como constante cuando se define la función.The following functions aren't valid because expressions that use algebraic operators or built-in functions must evaluate to a constant when you define the function. No se pueden incluir referencias de columna en las expresiones algebraicas o llamadas de función.You can't include column references in algebraic expressions or function calls.

    CREATE FUNCTION dbo.fn_example8(@column1 int)  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
            WHERE @column1 % 2 =  0  
    GO  
    
    CREATE FUNCTION dbo.fn_example9(@column1 int)  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
            WHERE SQRT(@column1) = 30  
    GO  
    
    
  • La función siguiente no es válida porque infringe las reglas descritas aquí después de reemplazar el operador BETWEEN por la expresión AND equivalente.The following function isn't valid because it violates the rules described here after you replace the BETWEEN operator with the equivalent AND expression.

    CREATE FUNCTION dbo.fn_example10(@column1 int, @column2 int)  
    RETURNS TABLE  
    WITH SCHEMABINDING  
    AS  
    RETURN  SELECT 1 AS is_eligible  
            WHERE (@column1 BETWEEN 1 AND 200 OR @column1 = 300) AND @column2 > 1000  
    GO  
    
    

    La función anterior es equivalente a la función siguiente después de reemplazar el operador BETWEEN por la expresión AND equivalente.The preceding function is equivalent to the following function after you replace the BETWEEN operator with the equivalent AND expression. Esta función no es válida porque las condiciones primitivas solo pueden utilizar el operador lógico OR.This function isn't valid because primitive conditions can only use the OR logical operator.

    CREATE FUNCTION dbo.fn_example11(@column1 int, @column2 int)  
    RETURNS TABLE  
    WITH SCHEMABINDING   
    AS   
    RETURN  SELECT 1 AS is_eligible  
            WHERE (@column1 >= 1 AND @column1 <= 200 OR @column1 = 300) AND @column2 > 1000  
    GO  
    
    

Cómo aplica Stretch Database la función de filtroHow Stretch Database applies the filter function

Stretch Database aplica la función de filtro a la tabla y determina las filas aptas mediante el operador CROSS APPLY.Stretch Database applies the filter function to the table and determines eligible rows by using the CROSS APPLY operator. Por ejemplo:For example:

SELECT * FROM stretch_table_name CROSS APPLY fn_stretchpredicate(column1, column2)  

Si la función devuelve un resultado no vacío para la fila, la fila será apta para la migración.If the function returns a non-empty result for the row, the row is eligible to be migrated.

Reemplazar una función de filtro existenteReplace an existing filter function

Para reemplazar una función de filtro especificada anteriormente, vuelva a ejecutar la instrucción ALTER TABLE y especifique un nuevo valor para el parámetro FILTER_PREDICATE .You can replace a previously specified filter function by running the ALTER TABLE statement again and specifying a new value for the FILTER_PREDICATE parameter. Por ejemplo:For example:

ALTER TABLE stretch_table_name SET ( REMOTE_DATA_ARCHIVE = ON (  
    FILTER_PREDICATE = dbo.fn_stretchpredicate2(column1, column2),  
    MIGRATION_STATE = <desired_migration_state>  
  

La nueva función insertada con valores de tabla tiene los requisitos siguientes.The new inline table-valued function has the following requirements.

  • La nueva función debe ser menos restrictiva que la anterior.The new function has to be less restrictive than the previous function.

  • Todos los operadores de la función anterior deben existir en la nueva.All the operators that existed in the old function must exist in the new function.

  • La función nueva no puede contener operadores que no existan en la anterior.The new function can't contain operators that don't exist in the old function.

  • No se puede cambiar el orden de los argumentos del operador.The order of operator arguments can't change.

  • Solo los valores constantes que forman parte de una comparación de <, <=, >, >= se pueden cambiar de forma que la función sea menos restrictiva.Only constant values that are part of a <, <=, >, >= comparison can be changed in a way that makes the function less restrictive.

Ejemplo de un reemplazo válidoExample of a valid replacement

Suponga que la función siguiente es la función de filtro actual.Assume that the following function is the current filter function.

CREATE FUNCTION dbo.fn_stretchpredicate_old(@column1 datetime, @column2 int)  
RETURNS TABLE  
WITH SCHEMABINDING   
AS   
RETURN  SELECT 1 AS is_eligible  
        WHERE @column1 < CONVERT(datetime, '1/1/2016', 101)  
            AND (@column2 < -100 OR @column2 > 100)  
GO  
  

La función siguiente es un reemplazo válido porque la nueva constante de fecha (que especifica una fecha límite posterior) hace que la función sea menos restrictiva.The following function is a valid replacement because the new date constant (which specifies a later cutoff date) makes the function less restrictive.

CREATE FUNCTION dbo.fn_stretchpredicate_new(@column1 datetime, @column2 int)  
RETURNS TABLE  
WITH SCHEMABINDING   
AS   
RETURN  SELECT 1 AS is_eligible  
        WHERE @column1 < CONVERT(datetime, '2/1/2016', 101)  
            AND (@column2 < -50 OR @column2 > 50)  
GO  
  

Ejemplos de reemplazos no válidosExamples of replacements that aren't valid

La función siguiente no es un reemplazo válido porque la nueva constante de fecha (que especifica una fecha límite anterior) no hace que la función sea menos restrictiva.The following function isn't a valid replacement because the new date constant (which specifies an earlier cutoff date) doesn't make the function less restrictive.

CREATE FUNCTION dbo.fn_notvalidreplacement_1(@column1 datetime, @column2 int)  
RETURNS TABLE  
WITH SCHEMABINDING   
AS   
RETURN  SELECT 1 AS is_eligible  
        WHERE @column1 < CONVERT(datetime, '1/1/2015', 101)  
            AND (@column2 < -100 OR @column2 > 100)  
GO  
  

La función siguiente no es un reemplazo válido porque se ha eliminado uno de los operadores de comparación.The following function isn't a valid replacement because one of the comparison operators has been removed.

CREATE FUNCTION dbo.fn_notvalidreplacement_2(@column1 datetime, @column2 int)  
RETURNS TABLE  
WITH SCHEMABINDING   
AS   
RETURN  SELECT 1 AS is_eligible  
        WHERE @column1 < CONVERT(datetime, '1/1/2016', 101)  
            AND (@column2 < -50)  
GO  
  

La función siguiente no es un reemplazo válido porque se ha agregado una nueva condición con el operador lógico AND.The following function isn't a valid replacement because a new condition has been added with the AND logical operator.

CREATE FUNCTION dbo.fn_notvalidreplacement_3(@column1 datetime, @column2 int)  
RETURNS TABLE  
WITH SCHEMABINDING   
AS   
RETURN  SELECT 1 AS is_eligible  
        WHERE @column1 < CONVERT(datetime, '1/1/2016', 101)  
            AND (@column2 < -100 OR @column2 > 100)  
            AND (@column2 <> 0)  
GO  
  

Quitar una función de filtro de una tablaRemove a filter function from a table

Para migrar toda la tabla en lugar de solo las filas seleccionadas, debe quitar la función existente. Para ello, establezca el parámetro FILTER_PREDICATE como NULL.To migrate the entire table instead of selected rows, remove the existing function by setting FILTER_PREDICATE to null. Por ejemplo:For example:

ALTER TABLE stretch_table_name SET ( REMOTE_DATA_ARCHIVE = ON (  
    FILTER_PREDICATE = NULL,  
    MIGRATION_STATE = <desired_migration_state>  
) )  
  

Después de quitar la función de filtro, todas las filas de la tabla son aptas para la migración.After you remove the filter function, all rows in the table are eligible for migration. Por consiguiente, no se podrá especificar una función de filtro para la misma tabla posteriormente, a menos que primero se recuperen de Azure todos los datos remotos de la tabla.As a result, you cannot specify a filter function for the same table later unless you bring back all the remote data for the table from Azure first. Esta restricción se aplica para evitar los casos en los que las filas que no son aptas para la migración cuando se proporciona una nueva función de filtro ya se hayan migrado a Azure.This restriction exists to avoid the situation where rows that are not eligible for migration when you provide a new filter function have already been migrated to Azure.

Comprobar la función de filtro aplicada a una tablaCheck the filter function applied to a table

Para comprobar la función de filtro aplicada a una tabla, abra la vista de catálogo sys.remote_data_archive_tables y compruebe el valor de la columna filter_predicate .To check the filter function applied to a table, open the catalog view sys.remote_data_archive_tables and check the value of the filter_predicate column. Si el valor es nulo, toda la tabla será apta para el archivado.If the value is null, the entire table is eligible for archiving. Para obtener más información, vea sys.remote_data_archive_tables (Transact-SQL).For more info, see sys.remote_data_archive_tables (Transact-SQL).

Notas de seguridad para las funciones de filtroSecurity notes for filter functions

Una cuenta en peligro con privilegios db_owner puede hacer lo siguiente.A compromised account with db_owner privileges can do the following things.

  • Crear y aplicar una función con valores de tabla que use gran cantidad de recursos del servidor o que espere durante un período prolongado, lo que provoca una denegación de servicio.Create and apply a table-valued function that consumes large amounts of server resources or waits for an extended period resulting in a denial of service.

  • Crear y aplicar una función con valores de tabla que permite deducir el contenido de una tabla para la que el usuario ha denegado explícitamente el acceso de lectura.Create and apply a table-valued function that makes it possible to infer the content of a table for which the user has been explicitly denied read access.

Consulte tambiénSee Also

ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)