Auswählen von Zeilen für die Migration mit einer Filterfunktion (Stretch Database)Select rows to migrate by using a filter function (Stretch Database)

GILT FÜR: JaSQL Server 2016 und höher (nur Windows) NeinAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data WarehouseAPPLIES TO: YesSQL Server 2016 and later (Windows only) NoAzure SQL Database NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

Wenn Sie inaktive Daten in einer separaten Tabelle speichern, können Sie Stretch Database so konfigurieren, dass die gesamte Tabelle migriert wird.If you store cold data in a separate table, you can configure Stretch Database to migrate the entire table. Wenn Ihre Tabelle sowohl heiße als auch kalte Daten enthält, können Sie ein Filterprädikat zum Auswählen der zu migrierenden Zeilen angeben.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. Das Filterprädikat ist eine Inline-Tabellenwertfunktion.The filter predicate is an inline table-valued function. Dieser Artikel beschreibt, wie Sie eine Inline-Tabellenwertfunktion schreiben, um die zu migrierenden Zeilen auszuwählen.This article describes how to write an inline table-valued function to select rows to migrate.

Wichtig

Wenn Sie eine schwache Filterfunktion angeben, wird die Datenmigration ebenfalls unzureichend ausgeführt.If you provide a filter function that performs poorly, data migration also performs poorly. Stretch Database wendet die Filterfunktion mithilfe des CROSS APPLY-Operators auf die Tabelle an.Stretch Database applies the filter function to the table by using the CROSS APPLY operator.

Wenn Sie keine Filterfunktion angeben, wird die gesamte Tabelle migriert.If you don't specify a filter function, the entire table is migrated.

Wenn Sie den Assistenten zum Aktivieren von Stretch für eine Datenbank ausführen, können Sie eine gesamte Tabelle migrieren oder eine Filterfunktion im Assistenten angeben.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. Wenn Sie zum Auswählen zu migrierender Zeilen eine andere Art von Filterfunktion verwenden möchten, führen Sie einen der folgenden Schritte aus.If you want to use a different type of filter function to select rows to migrate, do one of the following things.

  • Beenden Sie den Assistenten, und führen Sie die ALTER TABLE-Anweisung aus, um Stretch für die Tabelle zu aktivieren und eine Filterfunktion anzugeben.Exit the wizard and run the ALTER TABLE statement to enable Stretch for the table and to specify a filter function.

  • Führen Sie die ALTER TABLE-Anweisung aus, um eine Filterfunktion anzugeben, nachdem Sie den Assistenten beendet haben.Run the ALTER TABLE statement to specify a filter function after you exit the wizard.

Die ALTER TABLE-Syntax zum Hinzufügen einer Funktion wird weiter unten in diesem Artikel beschrieben.The ALTER TABLE syntax for adding a function is described later in this article.

Grundlegende Anforderungen für die FilterfunktionBasic requirements for the filter function

Die für ein Stretch Database-Filterprädikat erforderliche Inline-Tabellenwertfunktion sieht wie das folgende Beispiel aus.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>  

Die Parameter für die Funktion müssen Bezeichner für Spalten der Tabelle sein.The parameters for the function have to be identifiers for columns from the table.

Die Schemabindung ist erforderlich, um zu verhindern, dass Spalten, die von der Filterfunktion verwendet werden, gelöscht oder geändert werden.Schema binding is required to prevent columns that are used by the filter function from being dropped or altered.

RückgabewertReturn value

Wenn die Funktion ein nicht leeres Ergebnis zurückgibt, ist die Zeile für die Migration geeignet.If the function returns a non-empty result, the row is eligible to be migrated. Wenn die Funktion hingegen kein Ergebnis zurückgibt, ist die Zeile nicht für die Migration geeignet.Otherwise - that is, if the function doesn't return a result - the row is not eligible to be migrated.

BedingungenConditions

Das <Prädikat> kann aus einer oder mehreren Bedingungen bestehen, die mit dem logischen AND-Operator verknüpft sind.The <predicate> can consist of one condition, or of multiple conditions joined with the AND logical operator.

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

Jede Bedingung kann wiederum aus einer oder mehreren primitiven Bedingungen bestehen, die mit dem logischen OR-Operator verknüpft sind.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 ]  

Primitive BedingungenPrimitive conditions

Eine primitive Bedingung eignet sich für die folgenden Vergleiche.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 ] )  
}  
  
  • Vergleichen eines Funktionsparameters mit einem konstanten Ausdruck.Compare a function parameter to a constant expression. Beispiel: @column1 < 1000.For example, @column1 < 1000.

    Es folgt ein Beispiel, das überprüft, ob der Wert einer date -Spalte < 1.1.2016 ist.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  
    ) )  
    
    
  • Anwenden des Operators IS NULL oder IS NOT NULL auf einen Funktionsparameter.Apply the IS NULL or IS NOT NULL operator to a function parameter.

  • Verwenden des IN-Operators, um einen Funktionsparameter mit einer Liste konstanter Werte zu vergleichen.Use the IN operator to compare a function parameter to a list of constant values.

    Es folgt ein Beispiel, das überprüft, ob der Wert einer shipment_status -Spalte IN (N'Completed', N'Returned', N'Cancelled')ist.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  
    ) )  
    
    

VergleichsoperatorenComparison operators

Die folgenden Vergleichsoperatoren werden unterstützt.The following comparison operators are supported.

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

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

Konstante AusdrückeConstant expressions

Bei den Konstanten, die Sie in einer Filterfunktion verwenden, kann es sich um einen beliebigen deterministischen Ausdruck handeln, der beim Definieren der Funktion ausgewertet werden kann.The constants that you use in a filter function can be any deterministic expression that can be evaluated when you define the function. Konstante Ausdrücke können Folgendes enthalten.Constant expressions can contain the following things.

  • Literale.Literals. Beispiel: N'abc', 123.For example, N'abc', 123.

  • Algebraische Ausdrücke.Algebraic expressions. Beispiel: 123 + 456.For example, 123 + 456.

  • Deterministische Funktionen.Deterministic functions. Beispiel: SQRT(900).For example, SQRT(900).

  • Deterministische Konvertierungen, die CAST oder CONVERT verwenden.Deterministic conversions that use CAST or CONVERT. Beispiel: CONVERT(datetime, '1/1/2016', 101).For example, CONVERT(datetime, '1/1/2016', 101).

Andere AusdrückeOther expressions

Sie können die Operatoren BETWEEN und NOT BETWEEN verwenden, wenn die resultierende Funktion den hier beschriebenen Regeln entspricht, nachdem Sie die Operatoren BETWEEN und NOT BETWEEN durch die entsprechenden AND- und OR-Ausdrücke ersetzt haben.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.

Sie können keine Unterabfragen oder nicht deterministische Funktionen wie RAND() oder GETDATE() verwenden.You can't use subqueries or non-deterministic functions such as RAND() or GETDATE().

Hinzufügen einer Filterfunktion zu einer TabelleAdd a filter function to a table

Fügen Sie einer Tabelle eine Filterfunktion hinzu, indem Sie die ALTER TABLE -Anweisung ausführen und eine vorhandene Inline-Tabellenwertfunktion als Wert des Parameters FILTER_PREDICATE angeben.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. Beispiel:For example:

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

Nachdem Sie die Funktion als Prädikat an die Tabelle gebunden haben, gilt Folgendes:After you bind the function to the table as a predicate, the following things are true.

  • Bei der nächsten Datenmigration werden nur die Zeilen migriert, für die die Funktion einen nicht leeren Wert zurückgibt.The next time data migration occurs, only the rows for which the function returns a non-empty value are migrated.

  • Die von der Funktion verwendeten Spalten sind schemagebunden.The columns used by the function are schema bound. Sie können diese Spalten nicht ändern, solange eine Tabelle die Funktion als ihr Filterprädikat nutzt.You can't alter these columns as long as a table is using the function as its filter predicate.

Sie können die Inline-Tabellenwertfunktion nicht löschen, solange eine Tabelle die Funktion als ihr Filterprädikat nutzt.You can't drop the inline table-valued function as long as a table is using the function as its filter predicate.

Tipp

Erstellen Sie einen Index für die Spalten, die von der Funktion verwendet werden, um die Leistung der Filterfunktion zu verbessern.To improve the performance of the filter function, create an index on the columns used by the function.

Übergeben von Spaltennamen an die FilterfunktionPassing column names to the filter function

Wenn Sie einer Tabelle eine Filterfunktion zuweisen, geben Sie die an die Filterfunktion übergebenen Spaltennamen mit einem einteiligen Namen an.When you assign a filter function to a table, specify the column names passed to the filter function with a one-part name. Wenn Sie beim Übergeben der Spaltennamen einen dreiteiligen Namen angeben, treten bei nachfolgenden Abfragen der Stretch-aktivierten Tabelle Fehler auf.If you specify a three-part name when you pass the column names, subsequent queries against the Stretch-enabled table will fail.

Wenn Sie z.B. einen dreiteiligen Spaltennamen angeben, wie im folgenden Beispiel dargestellt, wird die Anweisung erfolgreich ausgeführt, bei nachfolgenden Abfragen der Tabelle treten jedoch Fehler auf.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 )
  )

Geben Sie die Filterfunktion stattdessen mit einem einteiligen Namen an, wie im folgenden Beispiel dargestellt.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 )
  )

Hinzufügen einer Filterfunktion nach dem Ausführen des AssistentenAdd a filter function after running the Wizard

Wenn Sie eine Funktion verwenden möchten, die Sie im Assistenten zum Aktivieren von Stretch für eine Datenbank nicht erstellen können, können Sie die ALTER TABLE -Anweisung ausführen, um nach Beenden des Assistenten eine Funktion anzugeben.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. Bevor eine Funktion angewendet werden kann, müssen Sie jedoch die Datenmigration anhalten, die bereits in Bearbeitung ist, und migrierte Daten zurückbringen.Before you can apply a function, however, you have to stop the data migration that's already in progress and bring back migrated data. (Weitere Informationen dazu, warum dies notwendig ist, finden Sie im Abschnitt Ersetzen einer vorhandenen Filterfunktion).(For more info about why this is necessary, see Replace an existing filter function.)

  1. Kehren Sie die Migrationsrichtung um, und bringen Sie bereits migrierte Daten zurück.Reverse the direction of migration and bring back the data already migrated. Dieser Vorgang kann nach dem Start nicht mehr abgebrochen werden.You can't cancel this operation after it starts. Es fallen auf Azure auch Kosten für ausgehende Datenübertragungen an.You also incur costs on Azure for outbound data transfers (egress). Weitere Informationen finden Sie unter Datenübertragungen – Preisdetails.For more info, see How Azure pricing works.

    ALTER TABLE <table name>  
        SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;   
    
  2. Warten Sie, bis die Migration abgeschlossen ist.Wait for migration to finish. Sie können den Status in SQL Server Management Studio im Stretch Database-Monitor überprüfen oder die Sicht sys.dm_db_rda_migration_status abfragen.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. Weitere Informationen finden Sie unter Monitor and troubleshoot data migration (Überwachung und Problembehandlung für die Datenmigration) oder sys.dm_db_rda_migration_status.For more info, see Monitor and troubleshoot data migration or sys.dm_db_rda_migration_status.

  3. Erstellen Sie die Filterfunktion, die auf die Tabelle angewendet werden soll.Create the filter function that you want to apply to the table.

  4. Fügen Sie die Funktion der Tabelle hinzu, und starten Sie die Datenmigration zu Azure neu.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  
            )  
            );   
    

Filtern von Zeilen nach DatumFilter rows by date

Im folgenden Beispiel werden Zeilen migriert, in denen die Spalte date einen Wert vor dem 1. Januar 2016 enthält.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  
  

Filtern von Zeilen nach dem Wert in einer StatusspalteFilter rows by the value in a status column

Im folgenden Beispiel werden Zeilen migriert, in denen die Spalte status einen der angegebenen Werte enthält.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  
  

Filtern von Zeilen mithilfe eines gleitenden FenstersFilter rows by using a sliding window

Um Zeilen mithilfe eines gleitenden Fensters zu filtern, beachten Sie die folgenden Anforderungen an die Filterfunktion.To filter rows by using a sliding window, keep in mind the following requirements for the filter function.

  • Die Funktion muss deterministisch sein.The function has to be deterministic. Sie können daher keine Funktion erstellen, die das gleitende Fenster im Ablauf der Zeit neu berechnet.Therefore you can't create a function that automatically recalculates the sliding window as time passes.

  • Die Funktion verwendet die Schemabindung.The function uses schema binding. Daher können Sie die Funktion nicht einfach täglich „direkt“ aktualisieren, indem Sie ALTER FUNCTION aufrufen, um das gleitende Fenster zu bewegen.Therefore you can't simply update the function "in place" every day by calling ALTER FUNCTION to move the sliding window.

Beginnen Sie mit einer Filterfunktion wie im folgenden Beispiel, bei dem Zeilen migriert werden, in denen die Spalte systemEndTime einen Wert vor dem 1. Januar 2016 enthält.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) ;  
  

Wenden Sie die Filterfunktion auf die Tabelle an.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   
                )  
        )   
;  
  

Wenn Sie das gleitende Fenster aktualisieren möchten, gehen Sie folgendermaßen vor.When you want to update the sliding window, do the following things.

  1. Erstellen Sie eine neue Funktion, die das neue gleitende Fenster angibt.Create a new function that specifies the new sliding window. Das folgende Beispiel wählt Datumsangaben vor dem 2. Januar 2016 statt vor dem 1. Januar 2016 aus.The following example selects dates earlier than January 2, 2016, instead of January 1, 2016.

  2. Ersetzen Sie die vorherige Filterfunktion durch die neue, indem Sie ALTER TABLEaufrufen, wie im folgenden Beispiel dargestellt.Replace the previous filter function with the new one by calling ALTER TABLE, as shown in the following example.

  3. Löschen Sie optional die vorherige Filterfunktion, die Sie nicht mehr verwenden, indem Sie DROP FUNCTIONaufrufen.Optionally, drop the previous filter function that you're no longer using by calling DROP FUNCTION. (Dieser Schritt ist nicht im Beispiel dargestellt.)(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 ;  
  

Weitere Beispiele gültiger FilterfunktionenMore examples of valid filter functions

  • Das folgende Beispiel kombiniert die beiden primitiven Bedingungen mithilfe des logischen Operators 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  
    ) )  
    
    
  • Im folgenden Beispiel werden verschiedene Bedingungen und eine deterministische Konvertierung mit CONVERT verwendet.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  
    
    
  • Im folgenden Beispiel werden die mathematische Operatoren und Funktionen verwendet.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  
    
    
  • Im folgenden Beispiel werden die Operatoren BETWEEN und NOT BETWEEN verwendet.The following example uses the BETWEEN and NOT BETWEEN operators. Diese Verwendung ist möglich, da die resultierende Funktion den hier beschriebenen Regeln entspricht, nachdem Sie die Operatoren BETWEEN und NOT BETWEEN durch die entsprechenden AND- und OR-Ausdrücke ersetzt haben.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  
    
    

    Die vorhergehende Funktion entspricht der folgenden Funktion nach dem Ersetzen der Operatoren BETWEEN und NOT BETWEEN durch die entsprechenden AND- und OR-Ausdrücke.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  
    
    

Beispiele ungültiger FilterfunktionenExamples of filter functions that aren't valid

  • Die folgende Funktion ist ungültig, da sie eine nicht deterministische Konvertierung enthält.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  
    
    
  • Die folgende Funktion ist ungültig, da sie einen nicht deterministischen Funktionsaufruf enthält.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  
    
    
  • Die folgende Funktion ist ungültig, da sie eine Unterabfrage enthält.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  
    
    
  • Die folgenden Funktionen sind ungültig, da Ausdrücke, die algebraische Operatoren oder integrierte Funktionen verwenden, beim Definieren der Funktion in eine Konstante ausgewertet werden müssen.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. Sie können keine Verweise auf Spalten in algebraische Ausdrücke oder Funktionsaufrufe einschließen.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  
    
    
  • Die folgende Funktion ist ungültig, da sie gegen die hier beschriebenen Regeln verstößt, nachdem Sie den Operator BETWEEN durch den entsprechenden AND-Ausdruck ersetzt haben.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  
    
    

    Die vorhergehende Funktion entspricht der folgenden Funktion nach dem Ersetzen des Operators BETWEEN durch den entsprechenden AND-Ausdruck.The preceding function is equivalent to the following function after you replace the BETWEEN operator with the equivalent AND expression. Diese Funktion ist ungültig, da primitive Bedingungen nur den logischen Operator OR verwenden können.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  
    
    

Anwenden der Filterfunktion durch Stretch DatabaseHow Stretch Database applies the filter function

Stretch Database wendet die Filterfunktion mithilfe des CROSS APPLY-Operators auf die Tabelle an und bestimmt berechtigte Zeilen.Stretch Database applies the filter function to the table and determines eligible rows by using the CROSS APPLY operator. Beispiel:For example:

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

Wenn die Funktion ein nicht leeres Ergebnis für die Zeile zurückgibt, ist die Zeile für die Migration geeignet.If the function returns a non-empty result for the row, the row is eligible to be migrated.

Ersetzen einer vorhandenen FilterfunktionReplace an existing filter function

Sie können eine zuvor angegebene Filterfunktion ersetzen, indem Sie die ALTER TABLE -Anweisung erneut ausführen und einen neuen Wert für den Parameter FILTER_PREDICATE angeben.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. Beispiel:For example:

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

Die neue Inline-Tabellenwertfunktion hat die folgenden Anforderungen.The new inline table-valued function has the following requirements.

  • Die neue Funktion muss weniger restriktiv als die vorherige Funktion sein.The new function has to be less restrictive than the previous function.

  • Alle Operatoren, die in der alten Funktion vorhanden waren, müssen in der neuen Funktion vorhanden sein.All the operators that existed in the old function must exist in the new function.

  • Die neue Funktion darf keine Operatoren enthalten, die in der alten Funktion nicht vorhanden waren.The new function can't contain operators that don't exist in the old function.

  • Der Reihenfolge der Operatorargumente kann sich nicht ändern.The order of operator arguments can't change.

  • Nur konstante Werte, die Teil eines <, <=, >, >= -Vergleichs sind, können in einer Weise geändert werden, die die Funktion weniger restriktiv macht.Only constant values that are part of a <, <=, >, >= comparison can be changed in a way that makes the function less restrictive.

Beispiel einer gültigen ErsetzungExample of a valid replacement

Angenommen, die folgende Funktion ist die aktuelle Filterfunktion.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  
  

Die folgende Funktion ist eine gültige Ersetzung, da die neue Datumskonstante (die ein späteres Umstellungsdatum angibt) die Funktion weniger restriktiv macht.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  
  

Beispiele für ungültige ErsetzungenExamples of replacements that aren't valid

Die folgende Funktion ist keine gültige Ersetzung, da die neue Datumskonstante (die ein früheres Umstellungsdatum angibt) die Funktion nicht weniger restriktiv macht.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  
  

Die folgende Funktion ist keine gültige Ersetzung, weil einer der Vergleichsoperatoren entfernt wurde.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  
  

Die folgende Funktion ist keine gültige Ersetzung, da eine neue Bedingung mit dem logischen Operator AND hinzugefügt wurde.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  
  

Entfernen einer Filterfunktion von einer TabelleRemove a filter function from a table

Entfernen Sie die vorhandene Funktion, indem Sie FILTER_PREDICATE auf NULL festlegen, um anstelle ausgewählter Zeilen die gesamte Tabelle zu migrieren.To migrate the entire table instead of selected rows, remove the existing function by setting FILTER_PREDICATE to null. Beispiel:For example:

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

Nachdem Sie die Filterfunktion entfernt haben, sind alle Zeilen in der Tabelle für die Migration geeignet.After you remove the filter function, all rows in the table are eligible for migration. Sie können daher nicht später eine Filterfunktion für dieselbe Tabelle angeben, es sei denn, Sie bringen zuerst alle Remotedaten für die Tabelle von Azure zurück.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. Diese Einschränkung gilt, um die Situation zu vermeiden, in der Zeilen, die nicht für die Migration geeignet sind, bei Angabe einer neuen Filterfunktion bereits in Azure migriert wurden.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.

Überprüfen der auf eine Tabelle angewendeten FilterfunktionCheck the filter function applied to a table

Öffnen Sie zum Überprüfen der Filterfunktion, die auf eine Tabelle angewendet wurde, die Katalogsicht sys.remote_data_archive_tables , und überprüfen Sie den Wert der Spalte 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. Falls der Wert NULL ist, ist die gesamte Tabelle für die Archivierung geeignet.If the value is null, the entire table is eligible for archiving. Weitere Informationen finden Sie unter sys.remote_data_archive_tables (Transact-SQL).For more info, see sys.remote_data_archive_tables (Transact-SQL).

Sicherheitshinweise für FilterfunktionenSecurity notes for filter functions

Ein kompromittiertes Konto mit db_owner-Berechtigungen kann folgende Aktionen ausführen.A compromised account with db_owner privileges can do the following things.

  • Erstellen und Anwenden einer Tabellenwertfunktion, die große Mengen an Serverressourcen verbraucht oder für einen längeren Zeitraum wartet, was zu einem Denial of Service führt.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.

  • Erstellen und Anwenden einer Tabellenwertfunktion, die es ermöglicht, den Inhalt einer Tabelle abzuleiten, für die dem Benutzer explizit der Lesezugriff verweigert wurde.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.

Weitere InformationenSee Also

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