Kategorien:

Tabellenfunktionen

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::

Erstellen von SQL zur Laufzeit

Syntax

TO_QUERY( SQL => '<string>' [ , <arg> => '<value>' [, <arg> => '<value>' ...] ] )
Copy

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:

  • 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'  );
Copy

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';
Copy

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)'));
Copy
+--------+------------+----------+
| 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)'));
Copy
+--------+
| 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'
    )
  );
Copy
+--------+------------+----------+
| 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
    )
  );
Copy
+--------+------------+----------+
| 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'
    )
  );
Copy
+--------+------------+----------+
| 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;
Copy

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;
$$
;
Copy

Rufen Sie die gespeicherte Prozedur auf:

CALL get_num_results_tq('SELECT * FROM to_query_example');
Copy
+----------+
| COUNT(*) |
|----------|
|        4 |
+----------+
CALL get_num_results_tq('SELECT * FROM to_query_example WHERE deptno = 20');
Copy
+----------+
| 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;
Copy

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;
$$
;
Copy

Rufen Sie die gespeicherte Prozedur auf:

CALL get_results_tqbnd('40');
Copy
+--------+------------+--------+
| DEPTNO | DNAME      | LOC    |
|--------+------------+--------|
|     40 | OPERATIONS | BOSTON |
+--------+------------+--------+

Rufen Sie die gespeicherte Prozedur mithilfe einer Sitzungsvariablen auf:

SET dept = '20';

CALL get_results_tqbnd($dept);
Copy
+--------+----------+--------+
| DEPTNO | DNAME    | LOC    |
|--------+----------+--------|
|     20 | RESEARCH | DALLAS |
+--------+----------+--------+