- Kategorien:
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> ] )
Nutzungshinweise¶
countundsecmüssen nicht negative Ganzzahlkonstanten sein.Wenn nur das Argument
ROWCOUNTangegeben ist, enthält die resultierende TabellecountZeilen.Wenn nur das Argument
TIMELIMITangegeben ist, wird die Abfrage fürsecSekunden 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
ROWCOUNTundTIMELIMITangegeben sind, gilt Folgendes:Wenn
ROWCOUNTvorTIMELIMITerreicht wird, enthält die resultierende TabellecountZeilen.Wenn
TIMELIMITvorROWCOUNTerreicht 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
ROWCOUNToderTIMELIMITnull ist, werden sie ignoriert.generator(ROWCOUNT => null)generiert also 0 Zeilen.Wenn beide Parameter (
ROWCOUNTundTIMELIMIT) 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 | +--------+----------------------------+
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 | +--------+--------------------+
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)) | |--------+----------------------------| +--------+----------------------------+
Im folgenden Beispiel wird der Parameter TIMELIMIT ohne den Parameter ROWCOUNT verwendet.
SELECT COUNT(seq4()) FROM TABLE(GENERATOR(TIMELIMIT => 10)) v;
+---------------+
| COUNT(SEQ4()) |
|---------------|
| 3615440896 |
+---------------+