Kategorien:

Tabellenfunktionen

GENERATOR

Erstellt Datenzeilen, die entweder auf einer bestimmten Anzahl von Zeilen, einem bestimmten Generierungszeitraum (in Sekunden) oder beidem basieren. Diese systemdefinierte Tabellenfunktion ermöglicht die Generierung synthetischer Zeilen.

Beachten Sie, dass es möglich ist, virtuelle Tabellen mit 0 Spalten, aber ggf. vielen Zeilen zu generieren. Solche virtuellen Tabellen sind nützlich für Abfragen, deren SELECT-Klausel ausschließlich aus datengenerierenden Funktionen besteht.

Syntax

GENERATOR( ROWCOUNT => <count> [ , TIMELIMIT => <sec> ] )

GENERATOR( [ TIMELIMIT => <sec> ] )
Copy

Nutzungshinweise

  • count und sec müssen nicht negative Ganzzahlkonstanten sein.

  • Wenn nur das Argument ROWCOUNT angegeben ist, enthält die resultierende Tabelle count Zeilen.

  • Wenn nur das Argument TIMELIMIT angegeben ist, wird die Abfrage für sec Sekunden ausgeführt. In dieser Zeit werden so viele Zeilen wie möglich generiert. Die genaue Anzahl der Zeilen hängt von der Systemgeschwindigkeit ab und ist nicht vollständig deterministisch.

  • Wenn beide Argumente ROWCOUNT und TIMELIMIT angegeben sind, gilt Folgendes:

    • Wenn ROWCOUNT vor TIMELIMIT erreicht wird, enthält die resultierende Tabelle count Zeilen.

    • Wenn TIMELIMIT vor ROWCOUNT erreicht ist, enthält die Tabelle die Anzahl der Zeilen, die innerhalb des Zeitrahmens generiert wurden. Die genaue Anzahl der Zeilen hängt von der Systemgeschwindigkeit ab und ist nicht vollständig deterministisch.

  • Wenn ROWCOUNT oder TIMELIMIT null ist, werden sie ignoriert. generator(ROWCOUNT => null) generiert also 0 Zeilen.

  • Wenn beide Parameter (ROWCOUNT und TIMELIMIT) nicht angegeben werden, gibt die Funktion GENERATOR 0 Zeilen zurück.

  • Der Inhalt der Zeilen wird von den Funktionen in der Projektionsklausel bestimmt, nicht von der Funktion GENERATOR selbst. Weitere Details dazu finden Sie im Abschnitt „Beispiele“ unten. Siehe auch die Beschreibung der spezifischen Funktionen (z. B. SEQ()), die Sie in der Projektionsklausel verwenden möchten. Nicht alle gültigen Funktionen erzeugen lückenlose Sequenzen.

Beispiele

Bemerkung

Diese Beispiele generieren Sequenzen, die Lücken haben können. Beispiele für Sequenzen ohne Lücken finden Sie unter SEQ1 / SEQ2 / SEQ4 / SEQ8 und ROW_NUMBER.

In diesem Beispiel wird die Funktion GENERATOR verwendet, um 10 Zeilen zu generieren. Der Inhalt der Zeilen wird durch die Funktionen in der Projektionsklausel bestimmt:

  • Die Spalte SEQ4() generiert eine Folge von 4-Byte-Ganzzahlen, beginnend mit 0.

  • Die Spalte UNIFORM(…) generiert Werte im Bereich zwischen dem ersten Parameter (1) und dem zweiten Parameter (10), die entweder auf einer Funktion oder einer Konstante basieren, die als dritter Parameter übergeben wird.

Dieses Beispiel enthält einen optionalen Startwert für die Funktion RANDOM(), damit die Ausgabe konsistent ist:

SELECT seq4(), uniform(1, 10, RANDOM(12)) 
  FROM TABLE(GENERATOR(ROWCOUNT => 10)) v 
  ORDER BY 1;
+--------+----------------------------+
| SEQ4() | UNIFORM(1, 10, RANDOM(12)) |
|--------+----------------------------|
|      0 |                          7 |
|      1 |                          2 |
|      2 |                          5 |
|      3 |                          9 |
|      4 |                          6 |
|      5 |                          9 |
|      6 |                          9 |
|      7 |                          5 |
|      8 |                          3 |
|      9 |                          8 |
+--------+----------------------------+
Copy

Dieses Beispiel ähnelt dem vorherigen Beispiel, außer dass es als dritter Parameter eine Konstante anstelle einer Funktion an die Funktion UNIFORM übergibt. Das Ergebnis ist, dass die Ausgabe für die Spalte UNIFORM für jede Zeile gleich ist.

SELECT seq4(), uniform(1, 10, 42) 
  FROM TABLE(GENERATOR(ROWCOUNT => 10)) v 
  ORDER BY 1;
+--------+--------------------+
| SEQ4() | UNIFORM(1, 10, 42) |
|--------+--------------------|
|      0 |                 10 |
|      1 |                 10 |
|      2 |                 10 |
|      3 |                 10 |
|      4 |                 10 |
|      5 |                 10 |
|      6 |                 10 |
|      7 |                 10 |
|      8 |                 10 |
|      9 |                 10 |
+--------+--------------------+
Copy

Wenn Sie die Parameter ROWCOUNT und TIMELIMIT nicht angeben, werden 0 Zeilen ausgegeben:

SELECT seq4(), uniform(1, 10, RANDOM(12)) 
  FROM TABLE(GENERATOR()) v 
  ORDER BY 1;
+--------+----------------------------+
| SEQ4() | UNIFORM(1, 10, RANDOM(12)) |
|--------+----------------------------|
+--------+----------------------------+
Copy

Im folgenden Beispiel wird der Parameter TIMELIMIT ohne den Parameter ROWCOUNT verwendet.

SELECT COUNT(seq4()) FROM TABLE(GENERATOR(TIMELIMIT => 10)) v;

+---------------+
| COUNT(SEQ4()) |
|---------------|
|    3615440896 |
+---------------+
Copy