- Kategorien:
TO_QUERY¶
Gibt ein Resultset zurück, das auf SQL-Text und einer optionalen Reihe von Argumenten basiert, die an den SQL-Text übergeben werden, wenn dieser parametrisiert ist. Die Funktion kompiliert den SQL-Text als Definition einer Unterabfrage in der FROM-Klausel. Wenn Sie eine Anwendung oder eine gespeicherte Prozedur schreiben, können Sie diese Funktion aufrufen, um eine SQL-Anweisung zu erstellen.
Bemerkung
Diese Funktion kann Benutzereingaben in Abfragen einschließen, was potenzielle Sicherheitsrisiken birgt, wie z. B. die Einschleusung von SQL-Befehlen. Wenn die Eingaben für die Funktion aus externen Quellen stammen, stellen Sie sicher, dass sie validiert sind. Weitere Informationen dazu finden Sie unter Einschleusung von SQL-Befehlen.
- Siehe auch::
Syntax¶
TO_QUERY( SQL => '<string>' [ , <arg> => '<value>' [, <arg> => '<value>' ...] ] )
Argumente¶
Erforderlich
SQL => 'string'
Zeichenfolgendarstellung der Unterabfrage
Optional
arg => 'value'
Bindungsvariablen an den SQL
string
übergeben.
Rückgabewerte¶
Gibt das Resultset zurück, das durch die Ausführung des angegebenen SQL-Textes erzeugt wurde oder NULL. Wenn eines der Argumente NULL lautet, gibt die Funktion NULL zurück, ohne einen Fehler zu melden.
Nutzungshinweise¶
Alle Argumente müssen einen der folgenden Werte aufweisen:
Konstante Zeichenfolgen.
SQL-Variablen oder Snowflake Scripting-Variablen, die in Zeichenfolgen aufgelöst werden.
Wenn Sie eine in einem Argument übergebene Zeichenfolge in einen anderen Datentyp konvertieren müssen, können Sie eine Konvertierungsfunktion in der SQL
string
verwenden, um die Zeichenfolge in einen anderen Datentyp zu konvertieren.Der Satz von Spalten, der das Resultset definiert, wird aus der SELECT-Liste der kompilierten SQL Anweisung abgeleitet.
Die Funktion ist nur in der FROM-Klausel einer SQL-Anweisung gültig.
Beispiele¶
Erstellen Sie eine Tabelle und fügen Sie Daten darin ein.
CREATE OR REPLACE TABLE to_query_example (
deptno NUMBER(2),
dname VARCHAR(14),
loc VARCHAR(13))
AS SELECT
column1,
column2,
column3
FROM
VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS' ),
(30, 'SALES', 'CHICAGO' ),
(40, 'OPERATIONS', 'BOSTON' );
Die Beispiele verwenden die Daten in dieser Tabelle.
Verwenden von TO_QUERY in SQL-Anweisungen¶
Legen Sie zunächst eine Sitzungsvariable (SQL-Variable) für den Tabellennamen fest:
SET table_name = 'to_query_example';
Die Beispiele verwenden die Sitzungsvariable und IDENTIFIER(), um die Tabelle zu identifizieren.
Die Verwendung von IDENTIFIER() zur Identifizierung von Datenbankobjekten ist eine bewährte Methode, da sie die Wiederverwendbarkeit des Codes erhöht und hilft, das Risiko der Einschleusung von SQL-Befehlen zu vermeiden.
Das folgende Beispiel verwendet die Funktion TO_QUERY, um alle Daten in der Tabelle to_query_example
zurückzugeben:
SELECT * FROM TABLE(TO_QUERY('SELECT * FROM IDENTIFIER($table_name)'));
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
|--------+------------+----------|
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
Das folgende Beispiel verwendet die Funktion TO_QUERY, um alle Werte in der Spalte deptno
der Tabelle to_query_example
zurückzugeben:
SELECT deptno FROM TABLE(TO_QUERY('SELECT * FROM IDENTIFIER($table_name)'));
+--------+
| DEPTNO |
|--------|
| 10 |
| 20 |
| 30 |
| 40 |
+--------+
Das folgende Beispiel verwendet die Funktion TO_QUERY, um ein Argument an eine Anweisung SQL zu übergeben, sodass sie die Zeile zurückgibt, in der deptno
gleich 10
in der Tabelle to_query_example
ist:
SELECT * FROM TABLE(
TO_QUERY(
'SELECT * FROM IDENTIFIER($table_name)
WHERE deptno = TO_NUMBER(:dno)', dno => '10'
)
);
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
|--------+------------+----------|
| 10 | ACCOUNTING | NEW YORK |
+--------+------------+----------+
Das folgende Beispiel ist dasselbe wie das vorherige, verwendet aber eine Sitzungsvariable, um den Wert deptno
an die Funktion TO_QUERY zu übergeben:
SET dept = '10';
SELECT * FROM TABLE(
TO_QUERY(
'SELECT * FROM IDENTIFIER($table_name)
WHERE deptno = TO_NUMBER(:dno)', dno => $dept
)
);
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
|--------+------------+----------|
| 10 | ACCOUNTING | NEW YORK |
+--------+------------+----------+
Das folgende Beispiel verwendet die Funktion TO_QUERY, um zwei Argumente an eine SQL-Anweisung zu übergeben, sodass sie die Zeilen zurückgibt, in denen deptno
gleich 10
oder dname
gleich SALES
in der Tabelle to_query_example
ist:
SELECT * FROM TABLE(
TO_QUERY(
'SELECT * FROM IDENTIFIER($table_name)
WHERE deptno = TO_NUMBER(:dno) OR dname = :dnm',
dno => '10', dnm => 'SALES'
)
);
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
|--------+------------+----------|
| 10 | ACCOUNTING | NEW YORK |
| 30 | SALES | CHICAGO |
+--------+------------+----------+
Verwenden von TO_QUERY in gespeicherten Prozeduren¶
Das folgende Beispiel verwendet die Funktion TO_QUERY in einer gespeicherten Prozedur:
CREATE OR REPLACE PROCEDURE get_num_results_tq(query VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
DECLARE
res RESULTSET DEFAULT (SELECT COUNT(*) FROM TABLE(TO_QUERY(:query)));
BEGIN
RETURN TABLE(res);
END;
Hinweis: Wenn Sie SnowSQL, die Classic Console oder die execute_stream
- oder execute_string
-Methode im Python-Konnektor-Code verwenden, benutzen Sie stattdessen das folgende Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor):
CREATE OR REPLACE PROCEDURE get_num_results_tq(query VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
$$
DECLARE
res RESULTSET DEFAULT (SELECT COUNT(*) FROM TABLE(TO_QUERY(:query)));
BEGIN
RETURN TABLE(res);
END;
$$
;
Rufen Sie die gespeicherte Prozedur auf:
CALL get_num_results_tq('SELECT * FROM to_query_example');
+----------+
| COUNT(*) |
|----------|
| 4 |
+----------+
CALL get_num_results_tq('SELECT * FROM to_query_example WHERE deptno = 20');
+----------+
| COUNT(*) |
|----------|
| 1 |
+----------+
Das folgende Beispiel verwendet die Funktion TO_QUERY in einer gespeicherten Prozedur mit einer Bindungsvariable:
CREATE OR REPLACE PROCEDURE get_results_tqbnd(dno VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
DECLARE
res RESULTSET DEFAULT (SELECT * FROM TABLE(
TO_QUERY(
'SELECT * FROM to_query_example
WHERE deptno = TO_NUMBER(:dnoval)', dnoval => :dno
)
));
BEGIN
RETURN TABLE(res);
END;
Hinweis: Wenn Sie SnowSQL, die Classic Console oder die execute_stream
- oder execute_string
-Methode im Python-Konnektor-Code verwenden, benutzen Sie stattdessen das folgende Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor):
CREATE OR REPLACE PROCEDURE get_results_tqbnd(dno VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
$$
DECLARE
res RESULTSET DEFAULT (SELECT * FROM TABLE(
TO_QUERY(
'SELECT * FROM to_query_example
WHERE deptno = TO_NUMBER(:dnoval)', dnoval => :dno
)
));
BEGIN
RETURN TABLE(res);
END;
$$
;
Rufen Sie die gespeicherte Prozedur auf:
CALL get_results_tqbnd('40');
+--------+------------+--------+
| DEPTNO | DNAME | LOC |
|--------+------------+--------|
| 40 | OPERATIONS | BOSTON |
+--------+------------+--------+
Rufen Sie die gespeicherte Prozedur mithilfe einer Sitzungsvariablen auf:
SET dept = '20';
CALL get_results_tqbnd($dept);
+--------+----------+--------+
| DEPTNO | DNAME | LOC |
|--------+----------+--------|
| 20 | RESEARCH | DALLAS |
+--------+----------+--------+