DDL-Anweisungen verwenden

Mithilfe von DDL-Anweisungen (Data Definition Language, Datendefinitionssprache) können Sie BigQuery-Ressourcen mit der Standard-SQL-Abfragesyntax erstellen und ändern. Derzeit können DDL-Befehle in BigQuery für Folgendes verwendet werden:

DDL-Anweisungen ausführen

Sie können DDL-Anweisungen mit der Cloud Console, dem bq-Befehlszeilentool oder der REST API jobs.query oder programmatisch mithilfe der BigQuery API-Clientbibliotheken ausführen.

Console

  1. Rufen Sie in der Cloud Console die Seite „BigQuery“ auf.

    BigQuery aufrufen

  2. Klicken Sie auf Neue Abfrage erstellen.

    Grafik: Neue Abfrage erstellen

  3. Geben Sie die DDL-Anweisung in den Textbereich des Abfrageeditors ein. Beispiel:

     CREATE TABLE mydataset.newtable ( x INT64 )
     

  4. Klicken Sie auf Ausführen.

bq

Geben Sie den Befehl bq query ein und legen Sie die DDL-Anweisung als Suchparameter fest. Legen Sie das Flag use_legacy_sql auf false fest.

bq query --use_legacy_sql=false \
  'CREATE TABLE mydataset.newtable ( x INT64 )'

API

Rufen Sie die Methode jobs.query auf und geben Sie die DDL-Anweisung im Attribut query des Anfragetextes an.

Die DDL-Funktionalität erweitert die von einer Jobressource zurückgegebenen Informationen. statistics.query.statementType enthält die folgenden zusätzlichen Werte zur DDL-Unterstützung:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query hat zwei zusätzliche Felder:

  • ddlOperationPerformed: Der DDL-Vorgang wurde ausgeführt, möglicherweise abhängig davon, ob das DDL-Ziel vorhanden ist. Zu den aktuellen Werten gehören:
    • CREATE: Die Abfrage hat das DDL-Ziel erstellt.
    • SKIP: Managementfrei. Beispiele: CREATE TABLE IF NOT EXISTS wurde gesendet und die Tabelle ist vorhanden. Oder DROP TABLE IF EXISTS wurde gesendet und die Tabelle ist nicht vorhanden.
    • REPLACE: Die Abfrage hat das DDL-Ziel ersetzt. Beispiel: CREATE OR REPLACE TABLE wurde gesendet und die Tabelle ist bereits vorhanden.
    • DROP: Die Abfrage hat das DDL-Ziel gelöscht.
  • ddlTargetTable: Wenn Sie die Anweisung CREATE TABLE/VIEW oder DROP TABLE/VIEW senden, wird die Zieltabelle als Objekt mit drei Feldern zurückgegeben:
    • "projectId": String
    • "datasetId": String
    • "tableId": String

Java

Rufen Sie die Methode BigQuery.create() auf, um einen Abfragejob zu starten. Rufen Sie die Methode Job.waitFor() auf, um auf den Abschluss der DDL-Abfrage zu warten.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.QueryJobConfiguration;

// Sample to create a view using DDL
public class DDLCreateView {

  public static void runDDLCreateView() {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetId = "MY_DATASET_ID";
    String tableId = "MY_VIEW_ID";
    String ddl =
        "CREATE VIEW "
            + "`"
            + projectId
            + "."
            + datasetId
            + "."
            + tableId
            + "`"
            + " OPTIONS("
            + " expiration_timestamp=TIMESTAMP_ADD("
            + " CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),"
            + " friendly_name=\"new_view\","
            + " description=\"a view that expires in 2 days\","
            + " labels=[(\"org_unit\", \"development\")]"
            + " )"
            + " AS SELECT name, state, year, number"
            + " FROM `bigquery-public-data.usa_names.usa_1910_current`"
            + " WHERE state LIKE 'W%'`";
    ddlCreateView(ddl);
  }

  public static void ddlCreateView(String ddl) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      QueryJobConfiguration config = QueryJobConfiguration.newBuilder(ddl).build();

      // create a view using query and it will wait to complete job.
      Job job = bigquery.create(JobInfo.of(config));
      job = job.waitFor();
      if (job.isDone()) {
        System.out.println("View created successfully");
      } else {
        System.out.println("View was not created");
      }
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("View was not created. \n" + e.toString());
    }
  }
}

Node.js

// Import the Google Cloud client library and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function ddlCreateView() {
  // Creates a view via a DDL query

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const projectId = "my_project"
  // const datasetId = "my_dataset"
  // const tableId = "my_new_view"

  const query = `
  CREATE VIEW \`${projectId}.${datasetId}.${tableId}\`
  OPTIONS(
      expiration_timestamp=TIMESTAMP_ADD(
          CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
      friendly_name="new_view",
      description="a view that expires in 2 days",
      labels=[("org_unit", "development")]
  )
  AS SELECT name, state, year, number
      FROM \`bigquery-public-data.usa_names.usa_1910_current\`
      WHERE state LIKE 'W%'`;

  // For all options, see https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query
  const options = {
    query: query,
  };

  // Run the query as a job
  const [job] = await bigquery.createQueryJob(options);

  job.on('complete', metadata => {
    console.log(`Created new view ${tableId} via job ${metadata.id}`);
  });
}

Python

Rufen Sie die Methode Client.query() auf, um einen Abfragejob zu starten. Rufen Sie die Methode QueryJob.result() auf, um auf den Abschluss der DDL-Abfrage zu warten.

# from google.cloud import bigquery
# project = 'my-project'
# dataset_id = 'my_dataset'
# table_id = 'new_view'
# client = bigquery.Client(project=project)

sql = """
CREATE VIEW `{}.{}.{}`
OPTIONS(
    expiration_timestamp=TIMESTAMP_ADD(
        CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
    friendly_name="new_view",
    description="a view that expires in 2 days",
    labels=[("org_unit", "development")]
)
AS SELECT name, state, year, number
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state LIKE 'W%'
""".format(
    project, dataset_id, table_id
)

job = client.query(sql)  # API request.
job.result()  # Waits for the query to finish.

print(
    'Created new view "{}.{}.{}".'.format(
        job.destination.project,
        job.destination.dataset_id,
        job.destination.table_id,
    )
)

CREATE TABLE-Anweisung

Zum Erstellen einer Tabelle in BigQuery verwenden Sie die DDL-Anweisung CREATE TABLE.

{CREATE TABLE | CREATE TABLE IF NOT EXISTS | CREATE OR REPLACE TABLE}
[[project_name.]dataset_name.]table_name
[(
  column_name column_schema[, ...]
)]
[PARTITION BY partition_expression]
[CLUSTER BY clustering_column_list]
[OPTIONS(table_option_list)]
[AS query_statement]

Dabei gilt:

{CREATE TABLE | CREATE TABLE IF NOT EXISTS | CREATE OR REPLACE TABLE} ist eine der folgenden Anweisungen:

  • CREATE TABLE: Erstellt eine neue Tabelle.
  • CREATE TABLE IF NOT EXISTS: Erstellt nur dann eine neue Tabelle, wenn die Tabelle im angegebenen Dataset derzeit nicht vorhanden ist.
  • CREATE OR REPLACE TABLE: Erstellt eine Tabelle und ersetzt dabei eine vorhandene Tabelle mit dem gleichen Namen im angegebenen Dataset.

Für CREATE TABLE-Anweisungen gelten die folgenden Regeln:

  • Es ist nur eine CREATE-Anweisung zulässig.
  • Es muss entweder die Spaltenliste, die as query_statement-Klausel oder beides vorhanden sein.
  • Sind sowohl die Spaltenliste als auch die as query_statement-Klausel vorhanden, ignoriert BigQuery die Namen in der as query_statement-Klausel und gleicht die Spalten mit der Spaltenliste nach Position ab.
  • Ist nur die as query_statement-Klausel und keine Spaltenliste vorhanden, ermittelt BigQuery die Spaltennamen und -typen über die as query_statement-Klausel.
  • Spaltennamen müssen über die Spaltenliste oder über die as query_statement-Klausel festgelegt werden.
  • Identische Spaltennamen sind nicht zulässig.

Tabellenpfad

project_name ist der Name des Projekts, in dem Sie die Tabelle erstellen. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

dataset_name ist der Name des Datasets, in dem Sie die Tabelle erstellen. Die Standardeinstellung ist defaultDataset in der Anfrage.

table_name ist der Name der Tabelle, die Sie erstellen.

Wenn Sie eine Tabelle in BigQuery erstellen, muss der Tabellenname pro Dataset eindeutig sein. Der Tabellenname kann:

  • bis zu 1.024 Zeichen enthalten
  • Unicode-Zeichen in Kategorie L (Buchstabe), M (Zeichen), N (Zahl), Pc (Verbindungselement, einschließlich Unterstrich), Pd (Strich), Zs (Leerzeichen) enthalten Weitere Informationen finden Sie unter Allgemeine Kategorie.

Beispiele für gültige Tabellennamen sind table-01, ग्राहक, 00_お客様, étudiant.

column_name und column_schema

(column_name column_schema[, ...]) enthält die Schemainformationen der Tabelle in einer durch Kommas getrennten Liste:

  • column_name ist der Name der Spalte. Für einen Spaltennamen gilt:
    • Er darf nur Buchstaben (a–z, A–Z), Ziffern (0–9) und Unterstriche (_) enthalten.
    • Er muss mit einem Buchstaben oder Unterstrich beginnen.
    • Er kann bis zu 128 Zeichen enthalten.
  • column_schema entspricht einem Datentyp, unterstützt aber eine optionale NOT NULL-Einschränkung für andere Typen als ARRAY. column_schema unterstützt auch Optionen für Spalten auf der obersten Ebene und STRUCT-Felder.
column_schema :=
   {simple_type [NOT NULL] |
    STRUCT<field_list> [NOT NULL] |
    ARRAY<array_element_schema>}
   [OPTIONS(column_option_list)]

field_list := field_name column_schema [, ...]

array_element_schema := {simple_type | STRUCT<field_list>} [NOT NULL]

simple_type kann ein beliebiger unterstützter Datentyp außer STRUCT und ARRAY sein.

field_name ist der Name des STRUCT-Felds. Für die Namen von STRUCT-Feldern gelten die gleichen Einschränkungen wie für Spaltennamen.

Wenn für eine Spalte oder ein Feld die Einschränkung NOT NULL gilt, wird die Spalte bzw. das Feld mit dem Modus REQUIRED erstellt. Ist hingegen die Einschränkung NOT NULL nicht vorhanden, wird die Spalte bzw. das Feld mit dem Modus NULLABLE erstellt.

Spalten und Felder vom Typ ARRAY unterstützen nicht den Modifikator NOT NULL. Ein column_schema vom Typ ARRAY<INT64> NOT NULL ist beispielsweise ungültig, da ARRAY-Spalten den Modus REPEATED haben und leer, aber nicht NULL sein können. Ein Arrayelement in einer Tabelle kann nicht NULL sein, unabhängig davon, ob die Einschränkung NOT NULL angegeben ist. ARRAY<INT64> entspricht beispielsweise ARRAY<INT64 NOT NULL>.

Das Attribut NOT NULL von column_schema einer Tabelle wird nicht durch Abfragen über die Tabelle weitergegeben. Wenn die Tabelle T zum Beispiel eine Spalte enthält, die als x INT64 NOT NULL deklariert ist, erstellt CREATE TABLE dataset.newtable AS SELECT x FROM T eine Tabelle mit dem Namen dataset.newtable, in der x den Wert NULLABLE hat.

column_schema kann nur in der Spaltendefinitionsliste von CREATE TABLE-Anweisungen und nicht als Typ in Ausdrücken verwendet werden. CAST(1 AS INT64 NOT NULL) ist beispielsweise ungültig.

partition_expression

PARTITION BY ist eine optionale Klausel, die die Tabellenpartitionierung steuert. partition_expression ist ein Ausdruck, der festlegt, wie die Tabelle partitioniert wird. Der Partitionsausdruck kann die folgenden Werte enthalten:

  • PARTITION BY DATE(_PARTITIONTIME): Partitioniert die Tabelle anhand des datumsbasierten Zeitstempels in _PARTITIONTIME pseudo column. Diese Syntax wird nur für CREATE TABLE ohne die Klausel AS query_statement unterstützt.
  • PARTITION BY _PARTITIONDATE: Partitioniert die Tabelle anhand von _PARTITIONDATE pseudo column. Diese Syntax wird nur für CREATE TABLE ohne die Klausel AS query_statement unterstützt und entspricht der Verwendung von PARTITION BY DATE(_PARTITIONTIME).
  • PARTITION BY DATE(<timestamp_column>): Partitioniert die Tabelle anhand des Datums der Spalte TIMESTAMP.
  • PARTITION BY RANGE_BUCKET(<integer_column>, GENERATE_ARRAY(start, end, interval)): Partitioniert die Tabelle anhand des angegebenen INTEGER-Spaltenbereichs. start ist der Anfang der Bereichspartitionierung (einschließlich), end ist das Ende der Bereichspartitionierung (ausschließlich) und interval die Breite jedes Bereichs innerhalb der Partition.
  • PARTITION BY TIMESTAMP_TRUNC(<timestamp_column>, [DAY|HOUR|MONTH|YEAR]): Partitioniert die Tabelle anhand von Datum/Stunde/Monat/Jahr der Spalte TIMESTAMP.
  • PARTITION BY DATETIME_TRUNC(<timestamp_column>, [DAY|HOUR|MONTH|YEAR]): Partitioniert die Tabelle anhand von Datum/Stunde/Monat/Jahr der Spalte DATETIME.
  • PARTITION BY <date_column>: Partitioniert die Tabelle anhand der Spalte DATE.

clustering_column_list

CLUSTER BY ist eine optionale Klausel, die das Tabellen-Clustering steuert. clustering_column_list ist eine durch Kommas getrennte Liste, mit der festgelegt wird, wie die Tabelle geclustert wird. In der Liste der Clustering-Spalten können bis zu vier Clustering-Spalten enthalten sein.

table_option_list

Mit der Optionsliste können Sie Tabellenoptionen wie ein Label oder eine Ablaufzeit festlegen. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.

Eine Tabellenoptionsliste muss im folgenden Format angegeben werden:

NAME=VALUE, ...

NAME und VALUE müssen mit einer der folgenden Varianten kombiniert werden:

NAME VALUE Details
expiration_timestamp TIMESTAMP

Beispiel: expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource.

partition_expiration_days

FLOAT64

Beispiel: partition_expiration_days=7

Dieses Attribut entspricht dem Attribut timePartitioning.expirationMs der Tabellenressource. Es werden jedoch Tage anstelle von Millisekunden verwendet. Ein Tag entspricht 86.400.000 Millisekunden oder 24 Stunden.

Dieses Attribut kann nur festgelegt werden, wenn die Tabelle partitioniert ist.

require_partition_filter

BOOL

Beispiel: require_partition_filter=true

Dieses Attribut entspricht dem Attribut timePartitioning.requirePartitionFilter der Tabellenressource.

Dieses Attribut kann nur festgelegt werden, wenn die Tabelle partitioniert ist.

kms_key_name

STRING

Beispiel: kms_key_name="projects/project_id/locations/location/keyRings/keyring/cryptoKeys/key"

Dieses Attribut entspricht dem Attribut encryptionConfiguration.kmsKeyName der Tabellenressource.

Weitere Informationen finden Sie unter Daten mit Cloud KMS-Schlüsseln schützen.

friendly_name

STRING

Beispiel: friendly_name="my_table"

Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource.

description

STRING

Beispiel: description="a table that expires in 2025"

Dieses Attribut entspricht dem Attribut description der Tabellenressource.

labels

ARRAY<STRUCT<STRING, STRING>>

Beispiel: labels=[("org_unit", "development")]

Dieses Attribut entspricht dem Attribut labels der Tabellenressource.

VALUE ist ein konstanter Ausdruck, der nur Literale, Suchparameter und Skalarfunktionen enthält. Wenn der konstante Ausdruck null ergibt, wird die entsprechende Option NAME ignoriert.

Der konstante Ausdruck darf Folgendes nicht enthalten:

  • Einen Verweis auf eine Tabelle
  • Unterabfragen – SQL-Anweisungen wie SELECT, CREATE und UPDATE
  • Benutzerdefinierte Funktionen, Aggregatfunktionen oder Analysefunktionen
  • Die folgenden Skalarfunktionen:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

column_option_list

Mit column_option_list in column_schema können Sie optionale Spalten- oder Feldoptionen angeben. Für Spalten- und Feldoptionen sind Syntax und Anforderungen identisch. Sie unterscheiden sich aber in den Listen für NAME und VALUE:

NAME VALUE Details
description

STRING

Beispiel: description="a unique id"

Dieses Attribut entspricht dem Attribut schema.fields[].description der Tabellenressource.

query_statement

Die Klausel AS query_statement gibt die Abfrage an, über die die Tabelle erstellt werden soll. Weitere Informationen zur unterstützten Form von query_statement finden Sie in der Referenz zur SQL-Syntax.

Bekannte Einschränkungen

  • Eine nach Aufnahmezeit partitionierte Tabelle kann nicht aus dem Ergebnis einer Abfrage erstellt werden. Erstellen Sie die Tabelle stattdessen mit der DDL-Anweisung CREATE TABLE und fügen Sie anschließend die Daten mithilfe der DML-Anweisung INSERT ein.
  • Eine Tabelle kann nicht mit dem Modifikator OR REPLACE durch eine andere Art der Partitionierung ersetzt werden. Löschen Sie stattdessen die Tabelle mit dem Befehl DROP und verwenden Sie anschließend die Anweisung CREATE TABLE ... AS SELECT ..., um sie neu zu erstellen.

Temporäre Tabellen

Zum Erstellen einer temporären Tabelle verwenden Sie das Schlüsselwort TEMP oder TEMPORARY, wenn Sie die Anweisung CREATE TABLE nutzen.

Syntax

{ CREATE {TEMP|TEMPORARY} TABLE |
  CREATE {TEMP|TEMPORARY} TABLE IF NOT EXISTS |
  CREATE OR REPLACE {TEMP|TEMPORARY} TABLE } ...

Abgesehen von der Verwendung von TEMP bzw. TEMPORARY ist die Syntax identisch mit jener von CREATE TABLE.

Qualifizieren Sie keine temporären Tabellennamen, d. h., verwenden Sie keinen Projekt- oder Dataset-Qualifier. Temporäre Tabellen werden automatisch in einem speziellen Dataset erstellt.

Für die Dauer des aktuellen Skripts können Sie auf eine temporäre Tabelle anhand des Namens verweisen. Weitere Informationen finden Sie unter Skripterstellung in Standard-SQL. Dazu gehören auch Tabellen, die im Rahmen einer Prozedur innerhalb des Skripts erstellt wurden. Sie können eine Tabelle nicht mehr abfragen, nachdem das Skript, in dem sie erstellt wurde, fertiggestellt ist.

Nachdem ein Skript beendet ist, ist die temporäre Tabelle bis zu 24 Stunden vorhanden. Sie wird nicht mit dem von Ihnen angegebenen Namen gespeichert, ihr wird stattdessen ein zufälliger Name zugewiesen. Um die Tabellenstruktur und die Daten aufzurufen, öffnen Sie die BigQuery-Konsole, klicken Sie auf Abfrageverlauf und wählen die Abfrage aus, mit der die temporäre Tabelle erstellt wurde. Klicken Sie dann in der Zeile Zieltabelle auf Temporäre Tabelle.

Temporäre Tabellen können nicht freigegeben werden. Sie können auch nicht mit der standardmäßigen Auflistungsmethode oder anderen Methoden zur Tabellenbearbeitung sichtbar gemacht werden. Beim Speichern temporärer Tabellen fallen keine Kosten für Sie an.

So erstellen Sie eine temporäre Tabelle:

CREATE TEMP TABLE Example
(
  x INT64,
  y STRING
);

INSERT INTO Example
VALUES (5, 'foo');

INSERT INTO Example
VALUES (6, 'bar');

SELECT *
FROM Example;

Dieses Skript gibt Folgendes zurück:

+-----+---+-----+
| Row | x | y   |
+-----+---|-----+
| 1   | 5 | foo |
| 2   | 6 | bar |
+-----+---|-----+

Sie können eine temporäre Tabelle explizit löschen, bevor das Skript abgeschlossen ist. Dazu müssen Sie eine DROP TABLE-Anweisung ausführen:

CREATE TEMP TABLE foo(x INT64);
SELECT * FROM foo;  -- Succeeds
DROP TABLE foo;
SELECT * FROM foo;  -- Results in an error

Wenn temporäre Tabellen zusammen mit einem Standard-Dataset verwendet werden, beziehen sich nicht qualifizierte Tabellennamen auf Folgendes:

  • Eine temporäre Tabelle, sofern vorhanden
  • Andernfalls eine Tabelle im Standard-Dataset

Eine Ausnahme sind CREATE TABLE-Anweisungen, bei denen die Zieltabelle nur dann als temporäre Tabelle gilt, wenn das Schlüsselwort TEMP oder TEMPORARY vorhanden ist.

Ein Beispiel ist das folgende Skript:

-- Create table t1 in the default dataset
CREATE TABLE t1 (x INT64);

-- Create temporary table t1
CREATE TEMP TABLE t1 (x INT64);

-- This statement will select from the temporary table
SELECT * FROM t1;

-- Drop the temporary table
DROP TABLE t1;

-- Now that the temporary table is dropped, this statement will select from
-- the table in the default dataset
SELECT * FROM t1;

Sie können explizit angeben, dass es sich um eine temporäre Tabelle handelt. Dazu qualifizieren Sie den Tabellennamen mit _SESSION:

-- Create a temp table
CREATE TEMP TABLE t1 (x INT64);

-- Create a temp table using the `_SESSION` qualifier
CREATE TEMP TABLE _SESSION.t2 (x INT64);

-- Select from a temporary table using the `_SESSION` qualifier
SELECT * FROM _SESSION.t1;

Wenn Sie den Qualifizierer _SESSION zum Abfragen einer temporären Tabelle verwenden, die nicht vorhanden ist, wird eine entsprechende Fehlermeldung angezeigt. Wenn z. B. keine temporäre Tabelle namens t3 vorliegt, wird die Fehlermeldung auch dann angezeigt, wenn im Standard-Dataset eine Tabelle namens t3 vorhanden ist.

Sie können _SESSION nicht zum Erstellen einer nicht temporären Tabelle verwenden:

CREATE TABLE _SESSION.t4 (x INT64);  -- Fails

Beispiele

Neue Tabellen erstellen

Im folgenden Beispiel wird in mydataset eine partitionierte Tabelle mit dem Namen newtable erstellt.

CREATE TABLE mydataset.newtable
(
  x INT64 OPTIONS(description="An optional INTEGER field"),
  y STRUCT<
    a ARRAY<STRING> OPTIONS(description="A repeated STRING field"),
    b BOOL
  >
)
PARTITION BY _PARTITIONDATE
OPTIONS(
  expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC",
  partition_expiration_days=1,
  description="a table that expires in 2025, with each partition living for 24 hours",
  labels=[("org_unit", "development")]
)

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.mydataset.newtable` anstelle von mydataset.newtable lauten.

Wenn der Tabellenname im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:

Already Exists: project_id:dataset.table

Die Tabelle verwendet den folgenden partition_expression-Ausdruck zum Partitionieren der Tabelle: PARTITION BY _PARTITIONDATE. Dieser Ausdruck partitioniert die Tabelle anhand des Datums in der Pseudospalte _PARTITIONDATE.

Das Tabellenschema enthält zwei Spalten:

  • x: Ganzzahlspalte mit der Beschreibung "An optional INTEGER field"
  • y: STRUCT mit zwei Spalten:

    • a: Stringarray mit der Beschreibung "A repeated STRING field"
    • b: boolescher Wert

Die Tabellenoptionsliste gibt Folgendes an:

  • Tabellenablaufzeit: 1. Januar 2025 um 00:00:00 UTC
  • Partitionsablaufzeit: 1 Tag
  • Beschreibung: Tabelle, die im Jahr 2025 abläuft
  • Label: org_unit = development

Neue Tabelle aus einer vorhandenen Tabelle erstellen

Im folgenden Beispiel wird eine Tabelle mit dem Namen top_words in mydataset aus einer Abfrage erstellt:

CREATE TABLE mydataset.top_words
OPTIONS(
  description="Top ten words per Shakespeare corpus"
) AS
SELECT
  corpus,
  ARRAY_AGG(STRUCT(word, word_count) ORDER BY word_count DESC LIMIT 10) AS top_words
FROM bigquery-public-data.samples.shakespeare
GROUP BY corpus;

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.mydataset.top_words` anstelle von mydataset.top_words lauten.

Wenn der Tabellenname im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:

Already Exists: project_id:dataset.table

Das Tabellenschema enthält zwei Spalten:

  • corpus: "Name of a Shakespeare corpus" (Name eines Shakespeare-Korpus)
  • top_words: ARRAY mit STRUCT-Werten, das zwei Felder enthält: word (ein STRING) und word_count (ein INT64-Wert mit der Anzahl der Wörter)

Die Tabellenoptionsliste gibt Folgendes an:

  • Beschreibung: die häufigsten zehn Wörter pro Shakespeare-Korpus

Tabelle nur erstellen, wenn die Tabelle nicht vorhanden ist

Im folgenden Beispiel wird nur dann in mydataset eine Tabelle namens newtable erstellt, wenn in mydataset keine Tabelle mit dem Namen newtable vorhanden ist. Ist der Tabellenname im Dataset vorhanden, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.

CREATE TABLE IF NOT EXISTS mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>)
OPTIONS(
  expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC",
  description="a table that expires in 2025",
  labels=[("org_unit", "development")]
)

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.mydataset.newtable` anstelle von mydataset.newtable lauten.

Das Tabellenschema enthält zwei Spalten:

  • x: Ganzzahl
  • y: STRUCT-Wert mit a (Stringarray) und b (boolescher Wert)

Die Tabellenoptionsliste gibt Folgendes an:

  • Ablaufzeit – 1. Januar 2025 um 00:00:00 UTC
  • Beschreibung: Tabelle, die im Jahr 2025 abläuft
  • Label: org_unit = development

Tabellen erstellen oder ersetzen

Im folgenden Beispiel wird in mydataset eine Tabelle mit dem Namen newtable erstellt. Wenn newtable bereits in mydataset vorhanden ist, wird diese Tabelle mit einer leeren Tabelle überschrieben.

CREATE OR REPLACE TABLE mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>)
OPTIONS(
  expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC",
  description="a table that expires in 2025",
  labels=[("org_unit", "development")]
)

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.mydataset.newtable` anstelle von mydataset.newtable lauten.

Das Tabellenschema enthält zwei Spalten:

  • x: Ganzzahl
  • y: STRUCT-Wert mit a (Stringarray) und b (boolescher Wert)

Die Tabellenoptionsliste gibt Folgendes an:

  • Ablaufzeit – 1. Januar 2025 um 00:00:00 UTC
  • Beschreibung: Tabelle, die im Jahr 2025 abläuft
  • Label: org_unit = development

Tabellen mit REQUIRED-Spalten erstellen

Im folgenden Beispiel wird in mydataset eine Tabelle mit dem Namen newtable erstellt. Der Modifikator NOT NULL in der Spaltendefinitionsliste einer CREATE TABLE-Anweisung gibt an, dass eine Spalte oder ein Feld im Modus REQUIRED erstellt wird.

CREATE TABLE my_dataset.new_table (
  x INT64 NOT NULL,
  y STRUCT<
    a ARRAY<STRING>,
    b BOOL NOT NULL,
    c FLOAT64
  > NOT NULL,
  z STRING
)

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.my_dataset.new_table` anstelle von my_dataset.new_table lauten.

Wenn der Tabellenname im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:

Already Exists: project_id:dataset.table

Das Tabellenschema enthält drei Spalten:

  • x: REQUIRED-Ganzzahl
  • y: REQUIRED-STRUCT-Wert mit a (Stringarray), b (boolescher REQUIRED-Wert) und c (NULLABLE-Gleitkommazahl)
  • z: NULLABLE-String

Partitionierte Tabelle erstellen

Im folgenden Beispiel wird in mydataset mithilfe einer DATE-Spalte eine partitionierte Tabelle mit dem Namen newtable erstellt.

CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_date DATE)
PARTITION BY transaction_date
OPTIONS(
  partition_expiration_days=3,
  description="a table partitioned by transaction_date"
)

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.mydataset.newtable` anstelle von mydataset.newtable lauten.

Das Tabellenschema enthält zwei Spalten:

  • transaction_id: Ganzzahl
  • transaction_date: Datum

Die Tabellenoptionsliste gibt Folgendes an:

  • Partitionsablauf: drei Tage
  • Beschreibung: eine nach transaction_date partitionierte Tabelle

Partitionierte Tabelle aus dem Ergebnis einer Abfrage erstellen

Im folgenden Beispiel wird in mydataset mithilfe einer DATE-Spalte eine partitionierte Tabelle mit dem Namen days_with_rain erstellt.

CREATE TABLE mydataset.days_with_rain
PARTITION BY date
OPTIONS (
  partition_expiration_days=365,
  description="weather stations with precipitation, partitioned by day"
) AS
SELECT
  DATE(CAST(year AS INT64), CAST(mo AS INT64), CAST(da AS INT64)) AS date,
  (SELECT ANY_VALUE(name) FROM `bigquery-public-data.noaa_gsod.stations` AS stations
   WHERE stations.usaf = stn) AS station_name,  -- Stations can have multiple names
  prcp
FROM `bigquery-public-data.noaa_gsod.gsod2017` AS weather
WHERE prcp != 99.9  -- Filter unknown values
  AND prcp > 0      -- Filter stations/days with no precipitation

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.mydataset.days_with_rain` anstelle von mydataset.days_with_rain lauten.

Das Tabellenschema enthält zwei Spalten:

  • date: Datum (DATE) der Datenerfassung
  • station_name: Name der Wetterstation als STRING
  • prcp: Niederschlagsmenge in Zoll als FLOAT64-Gleitkommazahl

Die Tabellenoptionsliste gibt Folgendes an:

  • Ablauf der Partition: ein Jahr
  • Beschreibung: Wetterstationen mit Niederschlag, nach Tag partitioniert

Geclusterte Tabellen erstellen

Beispiel 1

Im folgenden Beispiel wird in mydataset eine geclusterte Tabelle namens myclusteredtable erstellt. Die Tabelle ist eine partitionierte Tabelle, die nach einer Spalte vom Typ TIMESTAMP partitioniert und nach einer STRING-Spalte namens customer_id geclustert wird.

CREATE TABLE mydataset.myclusteredtable
(
  timestamp TIMESTAMP,
  customer_id STRING,
  transaction_amount NUMERIC
)
PARTITION BY DATE(timestamp)
CLUSTER BY customer_id
OPTIONS (
  partition_expiration_days=3,
  description="a table clustered by customer_id"
)

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.mydataset.myclusteredtable` anstelle von mydataset.myclusteredtable lauten.

Das Tabellenschema enthält drei Spalten:

  • timestamp: Zeitpunkt der Datenerfassung (Typ TIMESTAMP)
  • customer_id: Kundennummer (Typ STRING)
  • transaction_amount: Anzahl der Transaktionen (Typ NUMERIC)

Die Tabellenoptionsliste gibt Folgendes an:

  • Ablauf der Partition: 3 Tage
  • Beschreibung: eine nach customer_id geclusterte Tabelle
Beispiel 2

Im folgenden Beispiel wird in mydataset eine geclusterte Tabelle namens myclusteredtable erstellt. Die Tabelle ist eine nach Aufnahmezeit partitionierte Tabelle.

CREATE TABLE mydataset.myclusteredtable
(
  customer_id STRING,
  transaction_amount NUMERIC
)
PARTITION BY DATE(_PARTITIONTIME)
CLUSTER BY
  customer_id
OPTIONS (
  partition_expiration_days=3,
  description="a table clustered by customer_id"
)

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.mydataset.myclusteredtable` anstelle von mydataset.myclusteredtable lauten.

Das Tabellenschema enthält zwei Spalten:

  • customer_id: Kundennummer (Typ STRING)
  • transaction_amount: Anzahl der Transaktionen (Typ NUMERIC)

Die Tabellenoptionsliste gibt Folgendes an:

  • Ablauf der Partition: 3 Tage
  • Beschreibung: eine nach customer_id geclusterte Tabelle
Beispiel 3

Im folgenden Beispiel wird in mydataset eine geclusterte Tabelle namens myclusteredtable erstellt. Die Tabelle ist nicht partitioniert.

CREATE TABLE mydataset.myclusteredtable
(
  customer_id STRING,
  transaction_amount NUMERIC
)
CLUSTER BY
  customer_id
OPTIONS (
  description="a table clustered by customer_id"
)

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.mydataset.myclusteredtable` anstelle von mydataset.myclusteredtable lauten.

Das Tabellenschema enthält zwei Spalten:

  • customer_id: Kundennummer (Typ STRING)
  • transaction_amount: Anzahl der Transaktionen (Typ NUMERIC)

Die Tabellenoptionsliste gibt Folgendes an:

  • Beschreibung: eine nach customer_id geclusterte Tabelle

Geclusterte Tabellen aus dem Ergebnis einer Abfrage erstellen

Beispiel 1

Im folgenden Beispiel wird mithilfe des Ergebnisses einer Abfrage in mydataset eine geclusterte Tabelle namens myclusteredtable erstellt. Die Tabelle ist eine partitionierte Tabelle, die nach einer Spalte vom Typ TIMESTAMP partitioniert ist.

CREATE TABLE mydataset.myclusteredtable
(
  timestamp TIMESTAMP,
  customer_id STRING,
  transaction_amount NUMERIC
)
PARTITION BY DATE(timestamp)
CLUSTER BY
  customer_id
OPTIONS (
  partition_expiration_days=3,
  description="a table clustered by customer_id"
)
AS SELECT * FROM mydataset.myothertable

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.mydataset.myclusteredtable` anstelle von mydataset.myclusteredtable lauten.

Das Tabellenschema enthält drei Spalten:

  • timestamp: Zeitpunkt der Datenerfassung (Typ TIMESTAMP)
  • customer_id: Kundennummer (Typ STRING)
  • transaction_amount: Anzahl der Transaktionen (Typ NUMERIC)

Die Tabellenoptionsliste gibt Folgendes an:

  • Ablauf der Partition: 3 Tage
  • Beschreibung: eine nach customer_id geclusterte Tabelle
Beispiel 2

Im folgenden Beispiel wird mithilfe des Ergebnisses einer Abfrage in mydataset eine geclusterte Tabelle namens myclusteredtable erstellt. Die Tabelle ist nicht partitioniert.

CREATE TABLE mydataset.myclusteredtable
(
  customer_id STRING,
  transaction_amount NUMERIC
)
CLUSTER BY
  customer_id
OPTIONS (
  description="a table clustered by customer_id"
)
AS SELECT * FROM mydataset.myothertable

Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn project_id Sonderzeichen enthält: `project_id.dataset.table`. Daher kann der Tabellen-Qualifier `myproject.mydataset.myclusteredtable` anstelle von mydataset.myclusteredtable lauten.

Das Tabellenschema enthält zwei Spalten:

  • customer_id: Kundennummer (Typ STRING)
  • transaction_amount: Anzahl der Transaktionen (Typ NUMERIC)

Die Tabellenoptionsliste gibt Folgendes an:

  • Beschreibung: eine nach customer_id geclusterte Tabelle

CREATE VIEW-Anweisung

Zum Erstellen einer Ansicht in BigQuery verwenden Sie die DDL-Anweisung CREATE VIEW.

{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW}
[[project_name.]dataset_name.]view_name
[OPTIONS(view_option_list)]
AS query_expression

Dabei gilt:

{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW} ist eine der folgenden Anweisungen:

  • CREATE VIEW: Erstellt eine neue Ansicht.
  • CREATE VIEW IF NOT EXISTS: Erstellt nur dann eine neue Ansicht, wenn die Ansicht derzeit im angegebenen Dataset nicht vorhanden ist.
  • CREATE OR REPLACE VIEW: Erstellt eine Ansicht und ersetzt eine vorhandene Ansicht mit dem gleichen Namen im angegebenen Dataset.

project_name ist der Name des Projekts, in dem Sie die Ansicht erstellen. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

dataset_name ist der Name des Datasets, in dem Sie die Ansicht erstellen. Die Standardeinstellung ist defaultDataset in der Anfrage.

view_name ist der Name der Ansicht, die Sie ändern möchten. Der Ansichtsname muss pro Dataset eindeutig sein. Der Name der Ansicht darf:

  • bis zu 1.024 Zeichen enthalten
  • Buchstaben (groß-/kleingeschrieben), Zahlen und Unterstriche enthalten

Mit view_option_list können Sie zusätzliche Optionen zum Erstellen von Ansichten angeben, beispielsweise ein Label und eine Ablaufzeit.

Für CREATE VIEW-Anweisungen gelten die folgenden Regeln:

  • Es ist nur eine CREATE-Anweisung zulässig.

query_expression ist der Standard-SQL-Abfrageausdruck, der zur Definition der Ansicht verwendet wird.

view_option_list

Mit der Optionsliste können Sie Ansichtsoptionen wie ein Label und eine Ablaufzeit festlegen. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.

Die Liste der Ansichtsoptionen müssen Sie im folgenden Format angeben:

NAME=VALUE, ...

NAME und VALUE müssen mit einer der folgenden Varianten kombiniert werden:

NAME VALUE Details
expiration_timestamp TIMESTAMP

Beispiel: expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource.

friendly_name

STRING

Beispiel: friendly_name="my_view"

Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource.

description

STRING

Beispiel: description="a view that expires in 2025"

Dieses Attribut entspricht dem Attribut description der Tabellenressource.

labels

ARRAY<STRUCT<STRING, STRING>>

Beispiel: labels=[("org_unit", "development")]

Dieses Attribut entspricht dem Attribut labels der Tabellenressource.

VALUE ist ein konstanter Ausdruck, der nur Literale, Suchparameter und Skalarfunktionen enthält. Wenn der konstante Ausdruck null ergibt, wird die entsprechende Option NAME ignoriert.

Der konstante Ausdruck darf Folgendes nicht enthalten:

  • Einen Verweis auf eine Tabelle
  • Unterabfragen – SQL-Anweisungen wie SELECT, CREATE und UPDATE
  • Benutzerdefinierte Funktionen, Aggregatfunktionen oder Analysefunktionen
  • Die folgenden Skalarfunktionen:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

Standardprojekt im Ansichtstext

Wenn die Ansicht in dem Projekt erstellt wird, das zum Ausführen der CREATE VIEW-Anweisung verwendet wird, kann der Ansichtstext query_expression auf Entitäten verweisen, ohne das Projekt anzugeben. Das Standardprojekt ist das Projekt, zu dem die Ansicht gehört. Betrachten Sie die folgende Beispielabfrage.

CREATE VIEW myProject.myDataset.myView AS SELECT * FROM anotherDataset.myTable;

Nachdem Sie die obige CREATE VIEW-Abfrage im Projekt myProject ausgeführt haben, können Sie die Abfrage SELECT * FROM myProject.myDataset.myView ausführen. Unabhängig davon, in welchem Projekt Sie diese SELECT-Abfrage ausführen, wird die referenzierte Tabelle anotherDataset.myTable immer für das Projekt myProject aufgelöst.

Wenn die Ansicht nicht in dem Projekt erstellt wird, das zum Ausführen der CREATE VIEW-Anweisung verwendet wird, müssen alle Verweise im Ansichtstext query_expression mit Projekt-IDs qualifiziert sein. Die vorherige Beispielabfrage CREATE VIEW ist beispielsweise ungültig, wenn sie in einem anderen Projekt als myProject ausgeführt wird.

Beispiele

Neue Ansicht erstellen

Im folgenden Beispiel wird in mydataset eine Ansicht mit dem Namen newview erstellt.

CREATE VIEW `myproject.mydataset.newview`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="newview",
  description="a view that expires in 2 days",
  labels=[("org_unit", "development")]
)
AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

Wenn der Ansichtsname im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:

Already Exists: project_id:dataset.table

Die Ansicht wird mit der folgenden Abfrage in Standard-SQL definiert:

SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

Die Liste der Ansichtsoptionen legt Folgendes fest:

  • Ablaufzeit: 48 Stunden ab dem Zeitpunkt, an dem die Ansicht erstellt wird
  • Anzeigename: newview
  • Beschreibung: "A view that expires in 2 days"
  • Label: org_unit = development

Ansicht nur erstellen, wenn sie nicht vorhanden ist

Im folgenden Beispiel wird nur dann in mydataset eine Ansicht mit dem Namen newview erstellt, wenn in mydataset keine Ansicht mit dem Namen newview vorhanden ist. Wenn der Ansichtsname im Dataset vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.

CREATE VIEW IF NOT EXISTS `myproject.mydataset.newview`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="newview",
  description="a view that expires in 2 days",
  labels=[("org_unit", "development")]
)
AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

Die Ansicht wird mit der folgenden Abfrage in Standard-SQL definiert:

SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

Die Liste der Ansichtsoptionen legt Folgendes fest:

  • Ablaufzeit: 48 Stunden ab dem Zeitpunkt, an dem die Ansicht erstellt wird
  • Anzeigename: newview
  • Beschreibung: "A view that expires in 2 days"
  • Label: org_unit = development

Ansicht erstellen oder ersetzen

Im folgenden Beispiel wird in mydataset eine Ansicht mit dem Namen newview erstellt. Wenn newview bereits in mydataset vorhanden ist, wird diese mit dem angegebenen Abfrageausdruck überschrieben.

CREATE OR REPLACE VIEW `myproject.mydataset.newview`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="newview",
  description="a view that expires in 2 days",
  labels=[("org_unit", "development")]
)
AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

Die Ansicht wird mit der folgenden Abfrage in Standard-SQL definiert:

SELECT column_1, column_2, column_3 FROM myproject.mydataset.mytable

Die Liste der Ansichtsoptionen legt Folgendes fest:

  • Ablaufzeit: 48 Stunden ab dem Zeitpunkt, an dem die Ansicht erstellt wird
  • Anzeigename: newview
  • Beschreibung: "A view that expires in 2 days"
  • Label: org_unit = development

CREATE MATERIALIZED VIEW-Anweisung

Verwenden Sie die DDL-Anweisung CREATE MATERIALIZED VIEW, um eine materialisierte Ansicht in BigQuery zu erstellen.

{CREATE MATERIALIZED VIEW | CREATE MATERIALIZED VIEW IF NOT EXISTS }
[[project_name.]dataset_name.]materialized_view_name
[OPTIONS(materialized_view_option_list)]
AS query_expression

Dabei gilt:

{CREATE MATERIALIZED VIEW | CREATE MATERIALIZED VIEW IF NOT EXISTS } ist eine der folgenden Anweisungen:

  • CREATE MATERIALIZED VIEW: Erstellt eine neue materialisierte Ansicht.

  • CREATE MATERIALIZED VIEW IF NOT EXISTS: Erstellt eine neue materialisierte Ansicht nur, wenn die materialisierte Ansicht derzeit nicht im angegebenen Dataset vorhanden ist.

project_name ist der Name des Projekts, in dem Sie die materialisierte Ansicht erstellen. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

Wenn der project_name weggelassen wird oder mit dem Projekt übereinstimmt, das diese DDL-Abfrage ausführt, wird Letzteres auch als Standardprojekt für die Verweise auf Tabellen, Funktionen usw. in query_expression verwendet. Beachten Sie, dass das Standardprojekt der Verweise feststeht und nicht von den zukünftigen Abfragen abhängt, die die neue materialisierte Ansicht aufrufen. Andernfalls müssen alle Verweise in query_expression mit Projekten qualifiziert sein.

dataset_name ist der Name des Datasets, in dem Sie die materialisierte Ansicht erstellen. Die Standardeinstellung ist defaultDataset in der Anfrage.

materialized_view_name ist der Name der materialisierten Ansicht, die Sie erstellen. Der Name der materialisierten Ansicht muss pro Dataset eindeutig sein. Der Name der materialisierten Ansicht kann:

  • bis zu 1.024 Zeichen enthalten
  • Buchstaben (groß-/kleingeschrieben), Zahlen und Unterstriche enthalten

Mit materialized_view_option_list können Sie zusätzliche Optionen für die materialisierte Ansicht festlegen, beispielsweise ob die Aktualisierung aktiviert ist, das Aktualisierungsintervall, ein Label und eine Ablaufzeit.

Für CREATE MATERIALIZED VIEW-Anweisungen gelten die folgenden Regeln:

  • Es ist nur eine CREATE-Anweisung zulässig.

query_expression ist der Standard-SQL-Abfrageausdruck, der zur Definition der materialisierten Ansicht verwendet wird.

materialized_view_option_list

In der Optionsliste können Sie Optionen für die materialisierte Ansicht festlegen, beispielsweise ob die Aktualisierung aktiviert ist, das Aktualisierungsintervall, ein Label und eine Ablaufzeit. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.

Geben Sie eine Optionsliste für die materialisierte Ansicht im folgenden Format an:

NAME=VALUE, ...

NAME und VALUE müssen mit einer der folgenden Varianten kombiniert werden:

NAME VALUE Details
enable_refresh BOOLEAN

Beispiel: enable_refresh=false

refresh_interval_minutes FLOAT64

Beispiel: refresh_interval_minutes=20

expiration_timestamp TIMESTAMP

Beispiel: expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource.

friendly_name

STRING

Beispiel: friendly_name="my_mv"

Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource.

description

STRING

Beispiel: description="a materialized view that expires in 2025"

Dieses Attribut entspricht dem Attribut description der Tabellenressource.

labels

ARRAY<STRUCT<STRING, STRING>>

Beispiel: labels=[("org_unit", "development")]

Dieses Attribut entspricht dem Attribut labels der Tabellenressource.

Standardprojekt im Text der materialisierten Ansicht

Wenn die materialisierte Ansicht in dem Projekt erstellt wird, das zum Ausführen der CREATE MATERIALIZED VIEW-Anweisung verwendet wird, kann der Text der materialisierten Ansicht query_expression auf Entitäten verweisen, ohne das Projekt anzugeben. Das Standardprojekt ist das Projekt, zu dem die materialisierte Ansicht gehört. Betrachten Sie die folgende Beispielabfrage.

CREATE MATERIALIZED VIEW myProject.myDataset.myView AS SELECT * FROM anotherDataset.myTable;

Nachdem Sie die obige CREATE MATERIALIZED VIEW-Abfrage im Projekt myProject ausgeführt haben, können Sie die Abfrage SELECT * FROM myProject.myDataset.myView ausführen. Unabhängig davon, in welchem Projekt Sie diese SELECT-Abfrage ausführen, wird die referenzierte Tabelle anotherDataset.myTable immer für das Projekt myProject aufgelöst.

Wenn die materialisierte Ansicht nicht in dem Projekt erstellt wird, das zum Ausführen der CREATE VIEW-Anweisung verwendet wird, müssen alle Verweise im Text der materialisierten Ansicht query_expression mit Projekt-IDs qualifiziert sein. Die vorherige Beispielabfrage CREATE MATERIALIZED VIEW ist beispielsweise ungültig, wenn sie in einem anderen Projekt als myProject ausgeführt wird.

Beispiele

Eine neue materialisierte Ansicht erstellen

Im folgenden Beispiel wird eine materialisierte Ansicht mit dem Namen new_mv in mydataset erstellt.

CREATE MATERIALIZED VIEW `myproject.mydataset.new_mv`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="new_mv",
  description="a materialized view that expires in 2 days",
  labels=[("org_unit", "development")].
  enable_refresh=true,
  refresh_interval_minutes=20
)
AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

Wenn der Name der materialisierten Ansicht im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:

Already Exists: project_id:dataset.materialized_view

Wenn Sie eine DDL-Anweisung zum Erstellen einer materialisierten Ansicht verwenden, müssen Sie das Projekt, das Dataset und die materialisierte Ansicht im folgenden Format angeben: `project_id.dataset.materialized_view` (einschließlich der Backticks, wenn project_id Sonderzeichen enthält); zum Beispiel `myproject.mydataset.new_mv`.

Die materialisierte Ansicht wird mit der folgenden Abfrage in Standard-SQL definiert:

SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

Die Optionsliste für die materialisierte Ansicht legt Folgendes fest:

  • Ablaufzeit: 48 Stunden ab dem Zeitpunkt, an dem die materialisierte Ansicht erstellt wird
  • Anzeigename: new_mv
  • Beschreibung: Eine materialisierte Ansicht, die in zwei Tagen abläuft
  • Label: org_unit = development
  • Aktualisierung aktiviert: "true"
  • Aktualisierungsintervall: 20 Minuten

Eine materialisierte Ansicht nur erstellen, wenn die materialisierte Ansicht nicht vorhanden ist

Im folgenden Beispiel wird nur dann in mydataset eine materialisierte Ansicht mit dem Namen new_mv erstellt, wenn in mydataset keine materialisierte Ansicht mit dem Namen new_mv vorliegt. Wenn der Name der materialisierten Ansicht im Dataset vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.

CREATE MATERIALIZED VIEW IF NOT EXISTS `myproject.mydataset.new_mv`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="new_mv",
  description="a view that expires in 2 days",
  labels=[("org_unit", "development")],
  enable_refresh=false
)
AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

Die materialisierte Ansicht wird mit der folgenden Abfrage in Standard-SQL definiert:

SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

Die Optionsliste für die materialisierte Ansicht legt Folgendes fest:

  • Ablaufzeit: 48 Stunden ab dem Zeitpunkt, an dem die Ansicht erstellt wird
  • Anzeigename: new_mv
  • Beschreibung: "A view that expires in 2 days"
  • Label: org_unit = development
  • Aktualisierung aktiviert: "false"

CREATE EXTERNAL TABLE-Anweisung

Mit der CREATE EXTERNAL TABLE-Anweisung wird eine externe Tabelle erstellt. Über externe Tabellen können in BigQuery Daten abgefragt werden, die außerhalb des BigQuery-Speichers abgelegt sind. Weitere Informationen zu externen Tabellen finden Sie unter Einführung in externe Datenquellen.

CREATE [OR REPLACE] EXTERNAL TABLE [IF NOT EXISTS] [[project_name.]dataset_name.]table_name
[(
  column_name column_schema,
  ...
)]
[WITH PARTITION COLUMNS
  [(
      partition_column_name partition_column_type,
      ...
  )]
]
OPTIONS (
  external_table_option_list,
  ...
);

Dabei gilt:

  • project_name ist der Name des Projekts, in dem Sie die Tabelle erstellen. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt.

  • dataset_name ist der Name des Datasets, in dem Sie die Tabelle erstellen.

  • table_name ist der Name der externen Tabelle.

  • column_name ist der Name einer Spalte in der Tabelle.

  • Mit column_schema wird das Schema der Spalte angegeben. Dabei wird dieselbe Syntax wie die Definition column_schema in der CREATE TABLE-Anweisung verwendet. Wenn Sie diese Klausel nicht einbeziehen, erkennt BigQuery das Schema automatisch.

  • partition_column_name ist der Name einer Partitionsspalte. Geben Sie dieses Feld an, wenn Ihre externen Daten ein mit Hive partitioniertes Layout verwenden. Weitere Informationen finden Sie unter Unterstützte Datenlayouts.

  • partition_column_type ist der Typ der Partitionsspalte.

  • external_table_option_list gibt eine Liste von Optionen zum Erstellen der externen Tabelle an.

external_table_option_list

Mit der Optionsliste legen Sie Optionen zum Erstellen der externen Tabelle fest. Die Optionen format und uris sind erforderlich. Geben Sie die Optionsliste im folgenden Format an: NAME=VALUE, ....

Optionen
allow_jagged_rows

BOOL

Bei true werden Zeilen ohne nachgestellte optionale Spalten zugelassen.

Gilt für CSV-Daten.

allow_quoted_newlines

BOOL

Bei true werden in Anführungszeichen eingeschlossene Datenabschnitte mit Zeilenumbruchzeichen in der Datei zugelassen.

Gilt für CSV-Daten.

compression

STRING

Komprimierungstyp der Datenquelle. Diese Werte werden unterstützt: GZIP Wenn keine Angabe erfolgt, ist die Datenquelle unkomprimiert.

Gilt für CSV- und JSON-Daten.

description

STRING

Eine Beschreibung dieser Tabelle.

enable_logical_types

BOOL

Bei true werden logische Avro-Typen in die entsprechenden SQL-Typen konvertiert. Weitere Informationen finden Sie unter Logische Typen.

Gilt für Avro-Daten.

encoding

STRING

Die Zeichencodierung der Daten. Unterstützte Werte sind: UTF8 (oder UTF-8), ISO_8859_1 (oder ISO-8859-1).

Gilt für CSV-Daten.

expiration_timestamp

TIMESTAMP

Die Zeit, zu der diese Tabelle abläuft. Wenn keine Angabe erfolgt, läuft die Tabelle nicht ab.

Beispiel: "2025-01-01 00:00:00 UTC".

field_delimiter

STRING

Das Trennzeichen für Felder in einer CSV-Datei.

Gilt für CSV-Daten.

format

STRING

Das Format der externen Daten. Unterstützte Werte sind: AVRO, CSV, DATASTORE_BACKUP, GOOGLE_SHEETS, NEWLINE_DELIMITED_JSON (oder JSON), ORC, PARQUET.

Der Wert JSON entspricht NEWLINE_DELIMITED_JSON.

hive_partition_uri_prefix

STRING

Ein gemeinsames Präfix für alle Quell-URIs, bevor die Codierung des Partitionierungsschlüssels beginnt. Gilt nur für mit Hive partitionierte Tabellen.

Gilt für Avro-, CSV-, JSON-, Parquet- und ORC-Daten.

Beispiel: "gs://bucket/path".

ignore_unknown_values

BOOL

Bei true werden zusätzliche Werte ignoriert, die nicht im Tabellenschema enthalten sind, ohne dass ein Fehler zurückgegeben wird.

Gilt für CSV- und JSON-Daten.

max_bad_records

INT64

Die maximale Anzahl fehlerhafter Datensätze, die beim Lesen der Daten ignoriert werden.

Gilt für CSV-, JSON- und Google Tabellen-Daten.

null_marker

STRING

Der String, der NULL-Werte in einer CSV-Datei darstellt.

Gilt für CSV-Daten.

projection_fields

STRING

Eine Liste der zu ladenden Entitätsattribute.

Gilt für Datastore-Daten.

quote

STRING

Der String, der zum Kennzeichnen von Datenabschnitten in einer CSV-Datei verwendet wird. Wenn Ihre Daten Zeilenumbruchzeichen in Anführungszeichen enthalten, setzen Sie auch das Attribut allow_quoted_newlines auf true.

Gilt für CSV-Daten.

require_hive_partition_filter

BOOL

Bei true ist für alle Abfragen über diese Tabelle ein Partitionsfilter erforderlich, mit dem Partitionen beim Lesen von Daten entfernt werden können. Gilt nur für mit Hive partitionierte Tabellen.

Gilt für Avro-, CSV-, JSON-, Parquet- und ORC-Daten.

sheet_range

STRING

Bereich einer Google Tabellen-Tabelle, aus der abgefragt werden soll.

Gilt für Google Tabellen-Daten.

Beispiel: “sheet1!A1:B20”.

skip_leading_rows

INT64

Die Anzahl der Zeilen am Anfang einer Datei, die beim Lesen der Daten übersprungen werden sollen.

Gilt für CSV- und Google Tabellen-Daten.

uris

ARRAY<STRING>

Ein Array von voll qualifizierten URIs für die externen Datenspeicherorte.

Beispiel: ["gs://bucket/path/*"].

Die CREATE EXTERNAL TABLE-Anweisung unterstützt nicht das Erstellen temporärer externer Tabellen.

Zum Erstellen einer extern partitionierten Tabelle verwenden Sie die Klausel WITH PARTITION COLUMNS, um die Details des Partitionsschemas anzugeben. BigQuery prüft die Spaltendefinitionen anhand des externen Speicherorts. Die Schemadeklaration muss die Reihenfolge der Felder im externen Pfad genau einhalten. Weitere Informationen zur externen Partitionierung finden Sie unter Extern partitionierte Daten abfragen.

Beispiele

Im folgenden Beispiel wird eine externe Tabelle aus mehreren URIs erstellt. Das Datenformat ist CSV. In diesem Beispiel wird die automatische Schemaerkennung verwendet.

CREATE EXTERNAL TABLE dataset.CsvTable OPTIONS (
  format = 'CSV',
  uris = ['gs://bucket/path1.csv', 'gs://bucket/path2.csv']
);

Im folgenden Beispiel wird eine externe Tabelle aus einer CSV-Datei erstellt und das Schema explizit angegeben. Außerdem wird das Feldtrennzeichen ('|') angegeben und die Anzahl der maximal zulässigen fehlerhaften Datensätzen festgelegt.

CREATE OR REPLACE EXTERNAL TABLE dataset.CsvTable
(
  x INT64,
  y STRING
)
OPTIONS (
  format = 'CSV',
  uris = ['gs://bucket/path1.csv'],
  field_delimiter = '|',
  max_bad_records = 5
);

Im folgenden Beispiel wird eine extern partitionierte Tabelle erstellt. Mit der automatischen Schemaerkennung wird sowohl das Dateisystem als auch das Hive-Partitionierungslayout ermittelt.

Wenn der externe Pfad beispielsweise gs://bucket/path/field_1=first/field_2=1/data.csv ist, lauten die Partitionsspalten field_1 (STRING) und field_2 (INT64).

CREATE EXTERNAL TABLE dataset.AutoHivePartitionedTable
WITH PARTITION COLUMNS
OPTIONS (
  uris=['gs://bucket/path/*'],
  format=csv,
  hive_partition_uri_prefix='gs://bucket/path'
);

Im folgenden Beispiel wird eine extern partitionierte Tabelle erstellt, indem die Partitionsspalten explizit angegeben werden. In diesem Beispiel wird davon ausgegangen, dass der externe Dateipfad das Muster gs://bucket/path/field_1=first/field_2=1/data.csv hat.

CREATE EXTERNAL TABLE dataset.CustomHivePartitionedTable
WITH PARTITION COLUMNS (
  field_1 STRING, -- column order must match the external path
  field_2 INT64
)
OPTIONS (
  uris=['gs://bucket/path/*'],
  format=csv,
  hive_partition_uri_prefix='gs://bucket/path'
);

CREATE FUNCTION-Anweisung

BigQuery unterstützt benutzerdefinierte Funktionen (UDFs). Mithilfe einer UDF können Sie unter Verwendung eines SQL-Ausdrucks oder mit JavaScript Funktionen erstellen. Diese Funktionen akzeptieren Spalten als Eingabe und führen Aktionen durch. Das Ergebnis dieser Aktionen wird als Wert zurückgegeben.

UDFs können entweder persistent oder temporär sein. Sie können persistente UDFs für mehrere Abfragen verwenden, temporäre UDFs jedoch nur in einer einzigen Abfrage. Weitere Informationen zu nutzerdefinierten Funktionen finden Sie unter nutzerdefinierte Funktionen.

UDF-Syntax

Verwenden Sie die folgende Syntax, um eine persistente UDF zu erstellen:

CREATE [OR REPLACE] FUNCTION [IF NOT EXISTS]
    [[project_name.]dataset_name.]function_name
    ([named_parameter[, ...]])
  [RETURNS data_type]
  { sql_function_definition | javascript_function_definition }

Verwenden Sie die folgende Syntax, um eine temporäre UDF zu erstellen:

CREATE [OR REPLACE] {TEMPORARY | TEMP} FUNCTION [IF NOT EXISTS]
    function_name
    ([named_parameter[, ...]])
  [RETURNS data_type]
  { sql_function_definition | javascript_function_definition }

named_parameter:
  param_name param_type

sql_function_definition:
  AS (sql_expression)

javascript_function_definition:
  [determinism_specifier]
  LANGUAGE js
  [OPTIONS (library = library_array)]
  AS javascript_code

determinism_specifier:
  { DETERMINISTIC | NOT DETERMINISTIC }

Diese Syntax besteht aus den folgenden Komponenten:

  • CREATE { FUNCTION | OR REPLACE FUNCTION | FUNCTION IF NOT EXISTS }: Erstellt oder aktualisiert eine Funktion. Zum Ersetzen einer vorhandenen gleichnamigen Funktion verwenden Sie das Schlüsselwort OR REPLACE. Wenn eine Abfrage als erfolgreich behandelt werden, aber keine Aktion auslösen soll, falls bereits eine gleichnamige Funktion vorhanden ist, verwenden Sie die Klausel IF NOT EXISTS.

  • project_name ist der Name des Projekts, in dem Sie die Funktion erstellen. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

  • dataset_name ist der Name des Datasets, in dem Sie die Funktion erstellen. Die Standardeinstellung ist defaultDataset in der Anfrage.

  • named_parameter: Besteht aus durch Kommas getrennten Paaren aus param_name und param_type. Der Wert von param_type ist ein BigQuery-Datentyp. Bei einer SQL-UDF kann der Wert von param_type auch ANY TYPE sein.

  • determinism_specifier. Gilt nur für benutzerdefinierte JavaScript-Funktionen. Weist BigQuery darauf hin, ob das Abfrageergebnis im Cache speicherbar ist. Kann einer der folgenden Werte sein:

    • DETERMINISTIC: Die Funktion gibt immer dasselbe Ergebnis zurück, wenn dieselben Argumente übergeben werden. Das Abfrageergebnis sind potenziell im Cache speicherbar. Wenn die Funktion add_one(i) beispielsweise immer i + 1 zurückgibt, ist die Funktion deterministisch.

    • NOT DETERMINISTIC: Die Funktion gibt nicht immer dasselbe Ergebnis zurück, wenn dieselben Argumente übergeben werden, und ist daher nicht im Cache speicherbar. Wenn add_random(i) zum Beispiel i + rand() zurückgibt, ist die Funktion nicht deterministisch und BigQuery verwendet keine im Cache gespeicherten Ergebnisse.

      Wenn alle aufgerufenen Funktionen DETERMINISTISCH sind, versucht BigQuery, das Ergebnis im Cache zu speichern, außer die Ergebnisse sind aus anderen Gründen nicht im Cache speicherbar. Weitere Informationen finden Sie unter Im Cache gespeicherte Abfrageergebnisse verwenden.

  • [RETURNS data_type]: Gibt den Datentyp an, der von der Funktion zurückgegeben wird.

    • Wenn die Funktion in SQL definiert ist, ist die Klausel RETURNS optional. Wenn die Klausel RETURNS nicht angegeben wird und die Funktion von einer Abfrage aufgerufen wird, leitet BigQuery den Ergebnistyp der Funktion aus dem SQL-Funktionsrumpf ab.
    • Wenn die Funktion in JavaScript definiert ist, muss die Klausel RETURNS verwendet werden. Weitere Informationen zu zulässigen Werten für data_type finden Sie unter Von JavaScript-UDFs unterstützte Datentypen.
  • AS (sql_expression). Gibt den SQL-Ausdruck an, der die Funktion definiert.

  • [OPTIONS (library = library_array)]. Definiert für eine JavaScript-UDF ein Array von JavaScript-Bibliotheken, die in die Funktionsdefinition aufgenommen werden sollen.

  • AS javascript_code. Gibt die Definition einer JavaScript-Funktion an. javascript_code ist ein Stringliteral.

SQL-UDF-Struktur

Erstellen Sie SQL-UDFs mit der folgenden Syntax:

CREATE [OR REPLACE] [TEMPORARY | TEMP] FUNCTION [IF NOT EXISTS]
    [[`project_name`.]dataset_name.]function_name
    ([named_parameter[, ...]])
  [RETURNS data_type]
  AS (sql_expression)

named_parameter:
  param_name param_type

Vorlagen für SQL-UDF-Parameter

Ein Vorlagenparameter mit param_type = ANY TYPE kann bei einem Funktionsaufruf mit mehr als einem Argumenttyp übereinstimmen.

  • Wenn mehr als ein Parameter den Typ ANY TYPE hat, erzwingt BigQuery keine Typbeziehung zwischen diesen Argumenten.
  • Der Rückgabetyp der Funktion darf nicht ANY TYPE sein. Er muss entweder ausgelassen werden, d. h. automatisch anhand von sql_expression ermittelt werden, oder ein expliziter Typ sein.
  • Werden der Funktion Argumente mit Typen übergeben, die nicht mit der Funktionsdefinition kompatibel sind, wird zum Aufrufzeitpunkt ein Fehler ausgelöst.

Standardprojekt im SQL-UDF-Text

Wenn die SQL-UDF in demselben Projekt erstellt wird, in dem die CREATE FUNCTION-Anweisung ausgeführt wird, kann der UDF-Text sql_expression auf Entitäten verweisen, ohne das Projekt anzugeben. Das Standardprojekt ist das Projekt, zu dem die UDF gehört. Betrachten Sie die folgende Beispielabfrage.

CREATE FUNCTION myProject.myDataset.myFunction() AS (anotherDataset.anotherFunction());

Nachdem Sie die obige CREATE FUNCTION-Abfrage im Projekt myProject ausgeführt haben, können Sie die Abfrage SELECT myProject.myDataset.myFunction() ausführen. Unabhängig davon, in welchem Projekt Sie diese SELECT-Abfrage ausführen, wird die referenzierte Funktion anotherDataset.anotherFunction immer für das Projekt myProject aufgelöst.

Wenn die UDF nicht in dem Projekt erstellt wird, das zum Ausführen der CREATE FUNCTION-Anweisung verwendet wird, müssen alle Verweise im UDF-Text sql_expression mit Projekt-IDs qualifiziert sein. Die vorherige Beispielabfrage CREATE FUNCTION ist beispielsweise ungültig, wenn sie in einem anderen Projekt als myProject ausgeführt wird.

SQL-UDF-Beispiele

Im folgenden Beispiel wird eine persistente SQL-UDF erstellt. Es wird dabei davon ausgegangen, dass im aktiven Projekt ein Dataset mit dem Namen mydataset vorhanden ist. Wenn kein Dataset mit diesem Namen vorhanden ist, finden Sie entsprechende Informationen in der Dokumentation zum Erstellen von Datasets.

CREATE FUNCTION mydataset.multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
AS (x * y);

Nachdem Sie die Anweisung CREATE FUNCTION ausgeführt haben, können Sie die neue persistente benutzerdefinierte Funktion in einer separaten Abfrage verwenden. Ersetzen Sie den Abfrageeditor durch den folgenden Inhalt und führen Sie die Abfrage aus:

WITH numbers AS
  (SELECT 1 AS x, 5 as y
  UNION ALL
  SELECT 2 AS x, 10 as y
  UNION ALL
  SELECT 3 as x, 15 as y)
SELECT x, y, mydataset.multiplyInputs(x, y) as product
FROM numbers;

Das obige Beispiel generiert folgende Ausgabe:

+-----+-----+--------------+
| x   | y   | product      |
+-----+-----+--------------+
| 1   | 5   | 5            |
| 2   | 10  | 20           |
| 3   | 15  | 45           |
+-----+-----+--------------+

Das folgende Beispiel zeigt eine persistente SQL-UDF, die einen Vorlagenparameter verwendet. Die daraus resultierende Funktion akzeptiert Argumente verschiedener Typen.

CREATE FUNCTION mydataset.addFourAndDivideAny(x ANY TYPE, y ANY TYPE) AS (
  (x + 4) / y
);

Nachdem Sie die Anweisung CREATE FUNCTION ausgeführt haben, können Sie die neue persistente benutzerdefinierte Funktion in einer separaten Abfrage verwenden:

SELECT addFourAndDivideAny(3, 4) AS integer_output,
       addFourAndDivideAny(1.59, 3.14) AS floating_point_output;

Diese Abfrage gibt die folgende Ausgabe zurück:

+----------------+-----------------------+
| integer_output | floating_point_output |
+----------------+-----------------------+
| 1.75           | 1.7802547770700636    |
+----------------+-----------------------+

Das folgende Beispiel zeigt eine SQL-UDF, die über einen Vorlagenparameter das letzte Element eines Arrays eines beliebigen Typs zurückgibt.

CREATE FUNCTION mydataset.lastArrayElement(arr ANY TYPE) AS (
  arr[ORDINAL(ARRAY_LENGTH(arr))]
);

Nachdem Sie die Anweisung CREATE FUNCTION ausgeführt haben, können Sie die neue persistente benutzerdefinierte Funktion in einer separaten Abfrage verwenden:

SELECT
  names[OFFSET(0)] AS first_name,
  lastArrayElement(names) AS last_name
FROM (
  SELECT ['Fred', 'McFeely', 'Rogers'] AS names UNION ALL
  SELECT ['Marie', 'Skłodowska', 'Curie']
);

Die obige Abfrage gibt die folgende Ausgabe zurück:

+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Fred       | Rogers    |
| Marie      | Curie     |
+------------+-----------+

Struktur einer JavaScript-UDF

Persistente JavaScript-UDFs werden mit der folgenden Syntax erstellt.

CREATE [OR REPLACE] [TEMPORARY | TEMP] FUNCTION [IF NOT EXISTS]
    [[`project_name`.]dataset_name.]function_name
    ([named_parameter[, ...]])
  RETURNS data_type
  [DETERMINISTIC | NOT DETERMINISTIC]
  LANGUAGE js
  [OPTIONS (library = library_array)]
  AS javascript_code

Weitere Informationen zu zulässigen Werten für data_type und Parametertypen finden Sie unter Unterstützte UDF-Datentypen in JavaScript.

Beispiele für JavaScript-UDFs

CREATE TEMP FUNCTION mydataset.multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS """
  return x*y;
""";

Nachdem Sie die Anweisung CREATE FUNCTION ausgeführt haben, können Sie die neue persistente JavaScript-UDF in einer separaten Abfrage verwenden:

WITH numbers AS
  (SELECT 1 AS x, 5 as y
  UNION ALL
  SELECT 2 AS x, 10 as y
  UNION ALL
  SELECT 3 as x, 15 as y)
SELECT x, y, multiplyInputs(x, y) as product
FROM numbers;

Das obige Beispiel generiert folgende Ausgabe:

+-----+-----+--------------+
| x   | y   | product      |
+-----+-----+--------------+
| 1   | 5   | 5            |
| 2   | 10  | 20           |
| 3   | 15  | 45           |
+-----+-----+--------------+

Sie können das Ergebnis einer UDF als Eingabe an eine andere UDF übergeben. Erstellen Sie beispielsweise eine persistente UDF mit der folgenden Abfrage:

CREATE FUNCTION mydataset.multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS """
  return x*y;
""";

Führen Sie dann eine andere Abfrage aus, um eine weitere persistente UDF zu erstellen:

CREATE FUNCTION mydataset.divideByTwo(x FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS """
  return x/2;
""";

Führen Sie nun die folgende Abfrage aus, um beide persistenten UDFs in derselben Abfrage zu verwenden:

WITH numbers AS
  (SELECT 1 AS x, 5 as y
  UNION ALL
  SELECT 2 AS x, 10 as y
  UNION ALL
  SELECT 3 as x, 15 as y)
SELECT x,
  y,
  mydataset.multiplyInputs(
    mydataset.divideByTwo(x), mydataset.divideByTwo(y)) as half_product
FROM numbers;

Das obige Beispiel generiert folgende Ausgabe:

+-----+-----+--------------+
| x   | y   | half_product |
+-----+-----+--------------+
| 1   | 5   | 1.25         |
| 2   | 10  | 5            |
| 3   | 15  | 11.25        |
+-----+-----+--------------+

Im folgenden Beispiel werden die Werte aller Felder namens "foo" im angegebenen JSON-String summiert.

CREATE FUNCTION mydataset.SumFieldsNamedFoo(json_row STRING)
  RETURNS FLOAT64
  LANGUAGE js
  AS """
  function SumFoo(obj) {
    var sum = 0;
    for (var field in obj) {
      if (obj.hasOwnProperty(field) && obj[field] != null) {
        if (typeof obj[field] == "object") {
          sum += SumFoo(obj[field]);
        } else if (field == "foo") {
          sum += obj[field];
        }
      }
    }
    return sum;
  }
  var row = JSON.parse(json_row);
  return SumFoo(row);
  """;

Nachdem Sie die Anweisung CREATE FUNCTION ausgeführt haben, können Sie die neue persistente benutzerdefinierte Funktion in einer separaten Abfrage verwenden:

WITH Input AS (
  SELECT STRUCT(1 AS foo, 2 AS bar, STRUCT('foo' AS x, 3.14 AS foo) AS baz) AS s, 10 AS foo UNION ALL
  SELECT NULL, 4 AS foo UNION ALL
  SELECT STRUCT(NULL, 2 AS bar, STRUCT('fizz' AS x, 1.59 AS foo) AS baz) AS s, NULL AS foo
)
SELECT
  TO_JSON_STRING(t) AS json_row,
  mydataset.SumFieldsNamedFoo(TO_JSON_STRING(t)) AS foo_sum
FROM Input AS t;

Das obige Beispiel generiert folgende Ausgabe:

+---------------------------------------------------------------------+---------+
| json_row                                                            | foo_sum |
+---------------------------------------------------------------------+---------+
| {"s":{"foo":1,"bar":2,"baz":{"x":"foo","foo":3.14}},"foo":10}       | 14.14   |
| {"s":null,"foo":4}                                                  | 4       |
| {"s":{"foo":null,"bar":2,"baz":{"x":"fizz","foo":1.59}},"foo":null} | 1.59    |
+---------------------------------------------------------------------+---------+

Regeln für Anführungszeichen

Der JavaScript-Code muss in Anführungszeichen gesetzt werden. Für einfache, einzeilige Code-Snippets können Sie einen Standardstring in Anführungszeichen verwenden:

CREATE FUNCTION mydataset.plusOne(x FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS "return x+1;";

In Fällen, in denen das Snippet Anführungszeichen enthält oder aus mehreren Zeilen besteht, verwenden Sie Blocks mit dreifachen Anführungszeichen:

CREATE FUNCTION mydataset.customGreeting(a STRING)
RETURNS STRING
LANGUAGE js AS """
  var d = new Date();
  if (d.getHours() &lt; 12) {
    return 'Good Morning, ' + a + '!';
  } else {
    return 'Good Evening, ' + a + '!';
  }
  """;

JavaScript-Bibliotheken einbeziehen

Sie können JavaScript-UDFs über den Bereich OPTIONS erweitern. In diesem Abschnitt können Sie JavaScript-Codebibliotheken für die UDF angeben.

CREATE FUNCTION mydataset.myFunc(a FLOAT64, b STRING)
  RETURNS STRING
  LANGUAGE js
  OPTIONS (
    library=["gs://my-bucket/path/to/lib1.js", "gs://my-bucket/path/to/lib2.js"]
  )
  AS
  """
      // Assumes 'doInterestingStuff' is defined in one of the library files.
      return doInterestingStuff(a, b);
  """;

SELECT mydataset.myFunc(3.14, 'foo');

Im vorherigen Beispiel ist der Code in lib1.js und lib2.js für jeden Code im Bereich javascript_code der UDF verfügbar. Sie können Bibliotheksdateien entweder mithilfe eines einzelnen Elements oder mit einer Arraysyntax angeben.

UDFs und die Cloud Console

Sie können die Cloud Console verwenden, um persistente benutzerdefinierte Funktionen zu erstellen.

Abfragen zum Erstellen persistenter UDFs ausführen

  1. Rufen Sie in der Cloud Console die Seite „BigQuery“ auf.

    BigQuery aufrufen

  2. Klicken Sie auf Neue Abfrage erstellen.

    Grafik: Neue Abfrage erstellen

  3. Geben Sie die UDF-Anweisung in den Textbereich des Abfrageeditors ein. Beispiel:

      CREATE FUNCTION mydataset.timesTwo(x FLOAT64)
      RETURNS FLOAT64
        LANGUAGE js AS """
        return x*2;
      """;
    
  4. Klicken Sie auf Ausführen.

  5. Ersetzen Sie nach dem Erstellen der persistenten UDF den Editorinhalt durch eine neue Abfrage, in der diese verwendet wird:

      SELECT mydataset.timesTwo(numbers) AS doubles
      FROM UNNEST([1, 2, 3, 4, 5]) AS numbers;
    
  6. Klicken Sie auf Ausführen.

UDFs und das bq-Befehlszeilentool

Sie können über das bq-Befehlszeilentool im Cloud SDK persistente UDFs erstellen.

Verwenden Sie die folgende Syntax, um eine Abfrage zum Erstellen einer persistenten UDF auszuführen:

bq query --use_legacy_sql=false '
  CREATE FUNCTION mydataset.AddTwo(x INT64) AS (x + 2);
'

CREATE PROCEDURE-Anweisung

Erstellt eine Prozedur als einen Block von Anweisungen, die von anderen Abfragen aufgerufen werden können.

CREATE [OR REPLACE] PROCEDURE [IF NOT EXISTS]
[[project_name.]dataset_name.]procedure_name (procedure_argument[, ...] )
[OPTIONS(procedure_option_list)]
BEGIN
statement_list
END;

procedure_argument: [procedure_argument_mode] argument_name argument_type

procedure_argument_mode: IN | OUT | INOUT

Beschreibung

project_name ist der Name des Projekts, in dem Sie das Verfahren erstellen. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

dataset_name ist der Name des Datasets, in dem Sie das Verfahren erstellen. Die Standardeinstellung ist defaultDataset in der Anfrage.

statement_list ist eine BigQuery-Anweisungsliste. Eine Anweisungsliste besteht aus einer Reihe von Anweisungen, die jeweils mit einem Semikolon abgeschlossen werden.

argument_type ist ein beliebiger gültiger BigQuery-Typ.

procedure_argument_mode gibt an, ob ein Argument eine Eingabe, eine Ausgabe oder beides ist.

Prozeduren können rekursiv sich selbst aufrufen.

procedure_option_list

Mit procedure_option_list können Sie Verfahrensoptionen angeben. Für Prozeduroptionen sind Syntax und Anforderungen identisch. Sie unterscheiden sich aber in den Listen für NAME und VALUE:

NAME VALUE Details
strict_mode

BOOL

Beispiel: strict_mode=FALSE

Wenn strict_mode TRUE ist, wird der Prozedurrumpf zusätzlichen Prüfungen auf Fehler wie nicht vorhandene Tabellen oder Spalten unterzogen. Die CREATE PROCEDURE-Anweisung schlägt fehl, wenn der Rumpf eine dieser Prüfungen nicht besteht.

Obwohl strict_mode nützlich zum Abrufen vieler gängiger Fehlertypen ist, ist es nicht vollständig. Die erfolgreiche Erstellung einer Prozedur mit strict_mode garantiert nicht, dass die Prozedur zur Laufzeit erfolgreich ausgeführt wird.

Wenn strict_mode FALSE ist, wird der Prozedurrumpf nur auf Syntax überprüft. Prozeduren, die wiederkehrend von selbst aufgerufen werden, sollten mit strict_mode=FALSE erstellt werden, um Fehler zu vermeiden, die durch die noch nicht vorhandene Prozedur während der Validierung verursacht wurden.

Der Standardwert ist TRUE.

Argumentmodus

IN gibt an, dass das Argument nur eine Eingabe für die Prozedur ist. Sie können für IN-Argumente entweder eine Variable oder einen Wertausdruck angeben.

OUT gibt an, dass das Argument eine Ausgabe der Prozedur ist. Ein OUT-Argument wird beim Start der Prozedur mit NULL initialisiert. Für OUT-Argumente müssen Sie eine Variable angeben.

INOUT gibt an, dass das Argument sowohl eine Eingabe für die Prozedur als auch eine Ausgabe der Prozedur ist. Auch für INOUT-Argumente müssen Sie eine Variable festlegen. Auf ein INOUT-Argument kann im Verfahrenstext in Form einer Variable und in Form von zugewiesenen neuen Werten verwiesen werden.

Wenn weder IN, OUT noch INOUT angegeben ist, wird das Argument als IN-Argument behandelt.

Bereich von Variablen

Wenn eine Variable außerhalb einer Prozedur deklariert sowie als INOUT- oder OUT-Argument an eine Prozedur übergeben wird und die Prozedur der Variablen einen neuen Wert zuweist, ist dieser außerhalb der Prozedur sichtbar.

In einer Prozedur deklarierte Variablen sind außerhalb der Prozedur nicht sichtbar und umgekehrt.

Mithilfe von SET kann einem OUT- oder INOUT-Argument aber ein Wert zugewiesen werden. Der geänderte Wert ist dann außerhalb des Verfahrens sichtbar. Wenn die Prozedur erfolgreich beendet wird, ist der Wert des OUT- bzw. INOUT-Arguments dann der endgültige Wert, der dieser INOUT-Variable zugewiesen wird.

Temporäre Tabellen sind immer für die Dauer des Skripts vorhanden. Wenn eine Prozedur eine temporäre Tabelle erstellt, kann der Aufrufer der Prozedur auch auf die temporäre Tabelle verweisen.

Standardprojekt im Verfahrenstext

In den Verfahrenstexten können Entitäten ohne Angabe des Projekts referenziert werden. Das Standardprojekt ist das Projekt, zu dem das Verfahren gehört, und nicht unbedingt das Projekt, mit dem die Anweisung CREATE PROCEDURE ausgeführt wird. Betrachten Sie die folgende Beispielabfrage.

CREATE PROCEDURE myProject.myDataset.QueryTable()
BEGIN
  SELECT * FROM anotherDataset.myTable;
END;

Nachdem Sie das obige Verfahren erstellt haben, können Sie die Abfrage CALL myProject.myDataset.QueryTable() ausführen. Unabhängig davon, in welchem Projekt Sie diese CALL-Abfrage ausführen, wird die referenzierte Tabelle anotherDataset.myTable immer für das Projekt myProject aufgelöst.

Beispiele

Im folgenden Beispiel wird eine Prozedur erstellt, die x sowohl als Eingabeargument verwendet als auch x als Ausgabe zurückgibt. Da für das Argument delta kein Argumentmodus festgelegt ist, gilt es als Eingabeargument. Die Prozedur besteht aus einem Block mit einer einzigen Anweisung, durch die die Summe der beiden Eingabeargumente zu x zugewiesen wird.

CREATE PROCEDURE mydataset.AddDelta(INOUT x INT64, delta INT64)
BEGIN
  SET x = x + delta;
END;

Im folgenden Beispiel wird die AddDelta-Prozedur aus dem obigen Beispiel aufgerufen, wobei beide Male die Variable accumulator an sie übergeben wird. Da die Änderungen an x innerhalb von AddDelta außerhalb von AddDelta sichtbar sind, erhöhen diese Prozeduraufrufe accumulator um insgesamt 8.

DECLARE accumulator INT64 DEFAULT 0;
CALL mydataset.AddDelta(accumulator, 5);
CALL mydataset.AddDelta(accumulator, 3);
SELECT accumulator;

Es wird Folgendes zurückgegeben:

+-------------+
| accumulator |
+-------------+
|           8 |
+-------------+

Im folgenden Beispiel wird die Prozedur SelectFromTablesAndAppend erstellt, die target_date als Eingabeargument verwendet und rows_added als Ausgabe zurückgibt. Mit der Prozedur wird aus einer Abfrage eine temporäre Tabelle DataForTargetDate erstellt. Anschließend wird die Anzahl der Zeilen in DataForTargetDate berechnet und das Ergebnis rows_added zugewiesen. Als Nächstes wird eine neue Zeile in TargetTable eingefügt, wobei der Wert von target_date als einer der Spaltennamen übergeben wird. Zum Schluss wird die Tabelle DataForTargetDate gelöscht und rows_added zurückgegeben.

CREATE PROCEDURE mydataset.SelectFromTablesAndAppend(
  target_date DATE, OUT rows_added INT64)
BEGIN
  CREATE TEMP TABLE DataForTargetDate AS
  SELECT t1.id, t1.x, t2.y
  FROM dataset.partitioned_table1 AS t1
  JOIN dataset.partitioned_table2 AS t2
  ON t1.id = t2.id
  WHERE t1.date = target_date
    AND t2.date = target_date;

  SET rows_added = (SELECT COUNT(*) FROM DataForTargetDate);

  SELECT id, x, y, target_date  -- note that target_date is a parameter
  FROM DataForTargetDate;

  DROP TABLE DataForTargetDate;
END;

Im folgenden Beispiel wird eine Variable rows_added deklariert und zusammen mit dem Wert von CURRENT_DATE als Argument an die Prozedur SelectFromTablesAndAppend aus dem vorherigen Beispiel übergeben. Anschließend wird in einer Meldung angegeben, wie viele Zeilen hinzugefügt wurden.

DECLARE rows_added INT64;
CALL mydataset.SelectFromTablesAndAppend(CURRENT_DATE(), rows_added);
SELECT FORMAT('Added %d rows', rows_added);

Anweisung ALTER TABLE SET OPTIONS

Mit der DDL-Anweisung ALTER TABLE SET OPTIONS können Sie die Optionen für eine Tabelle in BigQuery festlegen.

ALTER TABLE [IF EXISTS] [[project_name.]dataset_name.]table_name
SET OPTIONS(table_set_options_list)

Dabei gilt:

IF EXISTS: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Tabelle nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Tabelle nicht vorhanden ist.

project_name ist der Name des Projekts, das die zu ändernde Tabelle enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

dataset_name ist der Name des Datasets, das die zu ändernde Tabelle enthält. Die Standardeinstellung ist defaultDataset in der Anfrage.

table_name ist der Name der Tabelle, die geändert werden soll.

table_set_options_list

Mit der Optionsliste können Sie Tabellenoptionen wie ein Label oder eine Ablaufzeit festlegen. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.

Eine Tabellenoptionsliste muss im folgenden Format angegeben werden:

NAME=VALUE, ...

NAME und VALUE müssen mit einer der folgenden Varianten kombiniert werden:

NAME VALUE Details
expiration_timestamp TIMESTAMP

Beispiel: expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource.

partition_expiration_days

FLOAT64

Beispiel: partition_expiration_days=7

Dieses Attribut entspricht dem Attribut timePartitioning.expirationMs der Tabellenressource. Es werden jedoch Tage anstelle von Millisekunden verwendet. Ein Tag entspricht 86.400.000 Millisekunden oder 24 Stunden.

Dieses Attribut kann nur festgelegt werden, wenn die Tabelle partitioniert ist.

require_partition_filter

BOOL

Beispiel: require_partition_filter=true

Dieses Attribut entspricht dem Attribut timePartitioning.requirePartitionFilter der Tabellenressource.

Dieses Attribut kann nur festgelegt werden, wenn die Tabelle partitioniert ist.

kms_key_name

STRING

Beispiel: kms_key_name="projects/project_id/locations/location/keyRings/keyring/cryptoKeys/key"

Dieses Attribut entspricht dem Attribut encryptionConfiguration.kmsKeyName der Tabellenressource.

Weitere Informationen finden Sie unter Daten mit Cloud KMS-Schlüsseln schützen.

friendly_name

STRING

Beispiel: friendly_name="my_table"

Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource.

description

STRING

Beispiel: description="a table that expires in 2025"

Dieses Attribut entspricht dem Attribut description der Tabellenressource.

labels

ARRAY<STRUCT<STRING, STRING>>

Beispiel: labels=[("org_unit", "development")]

Dieses Attribut entspricht dem Attribut labels der Tabellenressource.

VALUE ist ein konstanter Ausdruck, der nur Literale, Suchparameter und Skalarfunktionen enthält. Wenn der konstante Ausdruck null ergibt, wird die entsprechende Option NAME ignoriert.

Der konstante Ausdruck darf Folgendes nicht enthalten:

  • Einen Verweis auf eine Tabelle
  • Unterabfragen – SQL-Anweisungen wie SELECT, CREATE und UPDATE
  • Benutzerdefinierte Funktionen, Aggregatfunktionen oder Analysefunktionen
  • Die folgenden Skalarfunktionen:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

Mit der Einstellung VALUE wird der vorhandene Wert dieser Option für die Tabelle ersetzt, wenn diese vorhanden ist. Wenn Sie für VALUE den Wert NULL festlegen, wird der Wert der Tabelle für diese Option gelöscht.

Beispiele

Ablaufzeitstempel und Beschreibung für eine Tabelle festlegen

Im folgenden Beispiel wird der Ablaufzeitstempel für eine Tabelle auf sieben Tage nach dem Ausführungszeitpunkt der ALTER TABLE-Anweisung festgelegt. Außerdem wird eine Beschreibung angegeben:

ALTER TABLE mydataset.mytable
SET OPTIONS (
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY),
  description="Table that expires seven days from now"
)

Erforderliches Partitionsfilterattribut für partitionierte Tabelle festlegen

Im folgenden Beispiel wird das Attribut timePartitioning.requirePartitionFilter für eine partitionierte Tabelle festgelegt.

ALTER TABLE mydataset.mypartitionedtable
SET OPTIONS (require_partition_filter=true)

Abfragen, die auf diese Tabelle verweisen, müssen einen Filter für die Partitionierungsspalte verwenden. Andernfalls gibt BigQuery einen Fehler zurück. Durch die Auswahl von true können Sie Fehler bei der Abfrage vermeiden, da nur die vorgesehenen Daten abgefragt werden.

Ablaufzeitstempel für eine Tabelle löschen

Im folgenden Beispiel wird der Ablaufzeitstempel für eine Tabelle gelöscht, sodass es nicht zu einem Ablauf kommt:

ALTER TABLE mydataset.mytable
SET OPTIONS (expiration_timestamp=NULL)

ALTER TABLE ADD COLUMN-Anweisung

Mit der ALTER TABLE ADD COLUMN-Anweisung werden einem vorhandenen Tabellenschema eine oder mehrere neue Spalten hinzugefügt. Weitere Informationen zu Schemaänderungen in BigQuery finden Sie unter Tabellenschemas ändern.

ALTER TABLE [[project_name.]dataset_name.]table_name
ADD COLUMN [IF NOT EXISTS] column_name column_schema [, ...]

Dabei gilt:

  • project_name ist der Name des Projekts, das die Tabelle enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt.

  • dataset_name ist der Name des Datasets, das die Tabelle enthält.

  • table_name ist der Name der Tabelle, die geändert werden soll. Die Tabelle muss bereits vorhanden sein und ein Schema haben.

  • column_name ist der Name der Spalte, die hinzugefügt werden soll.

  • column_schema ist das Schema der Spalte. Dieses Schema verwendet dieselbe Syntax wie das Spaltenschema für die CREATE TABLE-Anweisung.

Mit dieser Anweisung können Sie Folgendes nicht erstellen:

  • Partitionierte Spalten
  • Geclusterte Spalten
  • Verschachtelte Spalten in vorhandenen RECORD-Feldern

Sie können einem vorhandenen Tabellenschema keine REQUIRED-Spalte hinzufügen. Sie können jedoch eine verschachtelte Spalte vom Typ REQUIRED als Teil des neuen RECORD-Felds erstellen.

Ohne die IF NOT EXISTS-Klausel gibt die Anweisung einen Fehler zurück, wenn die Tabelle bereits eine Spalte mit diesem Namen enthält. Wenn die IF NOT EXISTS-Klausel enthalten und der Spaltenname bereits vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.

Der Wert der neuen Spalte für vorhandene Zeilen wird auf einen der folgenden Werte gesetzt:

  • NULL, wenn die neue Spalte mit dem Modus NULLABLE hinzugefügt wurde. Dies ist der Standardmodus.
  • Eine leeres ARRAY, wenn die neue Spalte mit dem Modus REPEATED hinzugefügt wurde.

Beispiele

Spalten hinzufügen

Im nachfolgenden Beispiel werden die folgenden Spalten einer vorhandenen Tabelle mit dem Namen mytable hinzugefügt:

  • Spalte A vom Typ STRING
  • Spalte B vom Typ GEOGRAPHY
  • Spalte C vom Typ NUMERIC mit dem Modus REPEATED
  • Spalte D vom Typ DATE mit einer Beschreibung
ALTER TABLE mydataset.mytable
  ADD COLUMN A STRING,
  ADD COLUMN IF NOT EXISTS B GEOGRAPHY,
  ADD COLUMN C ARRAY<NUMERIC>,
  ADD COLUMN D DATE OPTIONS(description="my description")

Wenn eine der Spalten A, C oder D bereits vorhanden ist, schlägt die Anweisung fehl. Wenn die Spalte B bereits vorhanden ist, wird die Anweisung aufgrund der IF NOT EXISTS-Klausel erfolgreich ausgeführt.

Spalte RECORD hinzufügen

Im folgenden Beispiel wird eine Spalte namens A vom Typ STRUCT hinzugefügt, die die folgenden verschachtelten Spalten enthält:

  • Spalte B vom Typ GEOGRAPHY
  • Spalte C vom Typ INT64 mit dem Modus REPEATED
  • Spalte D vom Typ INT64 mit dem Modus REQUIRED
  • Spalte E vom Typ TIMESTAMP mit einer Beschreibung
ALTER TABLE mydataset.mytable
   ADD COLUMN A STRUCT<
       B GEOGRAPHY,
       C ARRAY<INT64>,
       D INT64 NOT NULL,
       E TIMESTAMP OPTIONS(description="creation time")
       >

Die Abfrage schlägt fehl, wenn die Tabelle bereits eine Spalte namens A enthält, auch wenn diese Spalte keine der angegebenen verschachtelten Spalten enthält.

Für die neue STRUCT-Spalte mit dem Namen A sind Nullwerte zulässig. Die verschachtelte Spalte D innerhalb von A ist jedoch für alle STRUCT-Werte von A erforderlich.

ALTER VIEW SET OPTIONS-Anweisung

Mit der DDL-Anweisung ALTER VIEW SET OPTIONS können Sie die Optionen für eine Ansicht in BigQuery festlegen.

ALTER VIEW [IF EXISTS] [[project_name.]dataset_name.]view_name
SET OPTIONS(view_set_options_list)

Dabei gilt:

IF EXISTS: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Ansicht nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Ansicht nicht vorhanden ist.

project_name ist der Name des Projekts, das die zu ändernde Ansicht enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

dataset_name ist der Name des Datasets, das die zu ändernde Ansicht enthält. Die Standardeinstellung ist defaultDataset in der Anfrage.

view_name ist der Name der Ansicht, die geändert werden soll.

view_set_options_list

Mit der Optionsliste können Sie Ansichtsoptionen wie ein Label und eine Ablaufzeit festlegen. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.

Die Liste der Ansichtsoptionen müssen Sie im folgenden Format angeben:

NAME=VALUE, ...

NAME und VALUE müssen mit einer der folgenden Varianten kombiniert werden:

NAME VALUE Details
expiration_timestamp TIMESTAMP

Beispiel: expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource.

friendly_name

STRING

Beispiel: friendly_name="my_view"

Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource.

description

STRING

Beispiel: description="a view that expires in 2025"

Dieses Attribut entspricht dem Attribut description der Tabellenressource.

labels

ARRAY<STRUCT<STRING, STRING>>

Beispiel: labels=[("org_unit", "development")]

Dieses Attribut entspricht dem Attribut labels der Tabellenressource.

VALUE ist ein konstanter Ausdruck, der nur Literale, Suchparameter und Skalarfunktionen enthält. Wenn der konstante Ausdruck null ergibt, wird die entsprechende Option NAME ignoriert.

Der konstante Ausdruck darf Folgendes nicht enthalten:

  • Einen Verweis auf eine Tabelle
  • Unterabfragen – SQL-Anweisungen wie SELECT, CREATE und UPDATE
  • Benutzerdefinierte Funktionen, Aggregatfunktionen oder Analysefunktionen
  • Die folgenden Skalarfunktionen:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

Mit der Einstellung VALUE wird der vorhandene Wert dieser Option für die Ansicht ersetzt, wenn diese vorhanden ist. Wenn Sie für VALUE den Wert NULL festlegen, wird der Wert der Ansicht für diese Option gelöscht.

Beispiele

Ablaufzeitstempel und Beschreibung für eine Ansicht festlegen

Im folgenden Beispiel wird der Ablaufzeitstempel für eine Ansicht auf sieben Tage nach dem Ausführungszeitpunkt der ALTER VIEW-Anweisung festgelegt. Außerdem wird eine Beschreibung angegeben:

ALTER VIEW mydataset.myview
SET OPTIONS (
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY),
  description="View that expires seven days from now"
)

ALTER MATERIALIZED VIEW SET OPTIONS-Anweisung

Mit der DDL-Anweisung ALTER MATERIALIZED VIEW SET OPTIONS können Sie die Optionen für eine materialisierte Ansicht in BigQuery festlegen.

ALTER MATERIALIZED VIEW [IF EXISTS] [[project_name.]dataset_name.]materialized_view_name
SET OPTIONS(materialized_view_set_options_list)

Dabei gilt:

IF EXISTS: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Ansicht nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Ansicht nicht vorhanden ist.

project_name ist der Name des Projekts, das die zu ändernde materialisierte Ansicht enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

dataset_name ist der Name des Datasets, das die zu ändernde materialisierte Ansicht enthält. Die Standardeinstellung ist defaultDataset in der Anfrage.

materialized_view_name ist der Name der materialisierten Ansicht, die geändert werden soll.

materialized_view_set_options_list

In der Optionsliste können Sie Optionen für die materialisierte Ansicht festlegen, beispielsweise ob die Aktualisierung aktiviert ist, das Aktualisierungsintervall, ein Label und eine Ablaufzeit. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.

Geben Sie eine Optionsliste für die materialisierte Ansicht im folgenden Format an:

NAME=VALUE, ...

NAME und VALUE müssen mit einer der folgenden Varianten kombiniert werden:

NAME VALUE Details
enable_refresh BOOLEAN

Beispiel: enable_refresh=false

refresh_interval_minutes FLOAT64

Beispiel: refresh_interval_minutes=20

expiration_timestamp TIMESTAMP

Beispiel: expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource.

friendly_name

STRING

Beispiel: friendly_name="my_mv"

Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource.

description

STRING

Beispiel: description="a materialized view that expires in 2025"

Dieses Attribut entspricht dem Attribut description der Tabellenressource.

labels

ARRAY<STRUCT<STRING, STRING>>

Beispiel: labels=[("org_unit", "development")]

Dieses Attribut entspricht dem Attribut labels der Tabellenressource.

Mit der Einstellung VALUE wird der vorhandene Wert dieser Option für die materialisierte Ansicht ersetzt, wenn diese vorhanden ist. Wenn Sie für VALUE den Wert NULL festlegen, wird der Wert der materialisierten Ansicht für diese Option gelöscht.

Beispiele

Den Aktualisierungsstatus und das Aktualisierungsintervall für eine materialisierte Ansicht festlegen

Im folgenden Beispiel wird die Aktualisierung aktiviert und das Aktualisierungsintervall für eine materialisierte Ansicht auf 20 Minuten festgelegt:

ALTER MATERIALIZED VIEW mydataset.my_mv
SET OPTIONS (
  enable_refresh=true,
  refresh_interval_minutes=20
)

DROP TABLE-Anweisung

Mit der DDL-Anweisung DROP TABLE können Sie eine Tabelle in BigQuery löschen.

DROP TABLE [IF EXISTS] [[project_name.]dataset_name.]table_name

Dabei gilt:

IF EXISTS: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Tabelle nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Tabelle nicht vorhanden ist.

project_name ist der Name des Projekts, das die zu löschende Tabelle enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

dataset_name ist der Name des Datasets, das die zu löschende Tabelle enthält. Die Standardeinstellung ist defaultDataset in der Anfrage.

table_name ist der Name der zu löschenden Tabelle.

Beispiele

Tabelle löschen

Im folgenden Beispiel wird eine Tabelle mit dem Namen mytable in mydataset gelöscht:

DROP TABLE mydataset.mytable

Wenn der Tabellenname nicht im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:

Error: Not found: Table myproject:mydataset.mytable

Tabelle nur dann löschen, wenn sie vorhanden ist

Im folgenden Beispiel wird eine Tabelle mit dem Namen mytable in mydataset nur dann gelöscht, wenn die Tabelle vorhanden ist. Wenn der Tabellenname im Dataset nicht vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.

DROP TABLE IF EXISTS mydataset.mytable

DROP EXTERNAL TABLE-Anweisung

Mit der DROP EXTERNAL TABLE-Anweisung wird eine externe Tabelle gelöscht.

DROP EXTERNAL TABLE [IF EXISTS] [[project_name.]dataset_name.]table_name

Dabei gilt:

  • project_name ist der Name des Projekts, das die Tabelle enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt.

  • dataset_name ist der Name des Datasets, das die Tabelle enthält.

  • table_name ist der Name der Tabelle, die gelöscht werden soll.

Ohne die IF EXISTS-Klausel gibt die Anweisung einen Fehler zurück, wenn die externe Tabelle nicht vorhanden ist. Wenn die IF EXISTS-Klausel enthalten und die Tabelle nicht vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.

Wenn table_name vorhanden ist, aber keine externe Tabelle ist, gibt die Anweisung den folgenden Fehler zurück:

Cannot drop table_name which has type TYPE. An external table was expected.

Mit der DROP EXTERNAL-Anweisung wird nur die Definition der externen Tabelle aus BigQuery entfernt. Die am externen Speicherort hinterlegten Daten sind davon nicht betroffen.

Beispiele

Im folgenden Beispiel wird die externe Tabelle mit dem Namen external_table aus dem Dataset mydataset gelöscht. Wenn die externe Tabelle nicht vorhanden ist, wird ein Fehler zurückgegeben.

DROP EXTERNAL TABLE mydataset.external_table

Im folgenden Beispiel wird die externe Tabelle mit dem Namen external_table aus dem Dataset mydataset gelöscht. Wenn die externe Tabelle nicht vorhanden ist, wird kein Fehler zurückgegeben.

DROP EXTERNAL TABLE IF EXISTS mydataset.external_table

DROP VIEW-Anweisung

Mit der DDL-Anweisung DROP VIEW können Sie eine Ansicht in BigQuery löschen.

DROP VIEW [IF EXISTS] [[project_name.]dataset_name.]view_name

Dabei gilt:

IF EXISTS: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Ansicht nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Ansicht nicht vorhanden ist.

project_name ist der Name des Projekts, das die zu löschende Ansicht enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

dataset_name ist der Name des Datasets, das die zu löschende Ansicht enthält. Die Standardeinstellung ist defaultDataset in der Anfrage.

view_name ist der Name der Ansicht, die gelöscht werden soll.

Beispiele

Ansicht löschen

Im folgenden Beispiel wird eine Ansicht namens myview in mydataset gelöscht:

DROP VIEW mydataset.myview

Wenn der Ansichtsname im Dataset nicht vorhanden ist, wird der folgende Fehler zurückgegeben:

Error: Not found: Table myproject:mydataset.myview

Ansicht nur löschen, wenn die Ansicht vorhanden ist

Im folgenden Beispiel wird eine Ansicht mit dem Namen myview in mydataset nur dann gelöscht, wenn die Ansicht vorhanden ist. Wenn der Ansichtsname nicht im Dataset vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.

DROP VIEW IF EXISTS mydataset.myview

DROP MATERIALIZED VIEW-Anweisung

Mit der DDL-Anweisung DROP MATERIALIZED VIEW können Sie eine materialisierte Ansicht in BigQuery löschen.

DROP MATERIALIZED VIEW [IF EXISTS] [[project_name.]dataset_name.]mv_name

Dabei gilt:

IF EXISTS: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene materialisierte Ansicht nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene materialisierte Ansicht nicht vorhanden ist.

project_name ist der Name des Projekts, das die zu löschende materialisierte Ansicht enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

dataset_name ist der Name des Datasets, das die zu löschende materialisierte Ansicht enthält. Die Standardeinstellung ist defaultDataset in der Anfrage.

mv_name ist der Name der materialisierten Ansicht, die gelöscht werden soll.

Beispiele

Eine materialisierte Ansicht löschen

Im folgenden Beispiel wird eine materialisierte Ansicht mit dem Namen my_mv in mydataset gelöscht:

DROP MATERIALIZED VIEW mydataset.my_mv

Wenn der Name der materialisierten Ansicht nicht im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:

Error: Not found: Table myproject:mydataset.my_mv

Wenn Sie eine materialisierte Ansicht in einem anderen Projekt löschen, müssen Sie das Projekt, das Dataset und die materialisierte Ansicht im folgenden Format angeben: `project_id.dataset.materialized_view` (einschließlich der Backticks, wenn project_id Sonderzeichen enthält); zum Beispiel `myproject.mydataset.my_mv`.

Eine materialisierte Ansicht nur löschen, wenn sie vorhanden ist

Im folgenden Beispiel wird eine materialisierte Ansicht mit dem Namen my_mv in mydataset nur dann gelöscht, wenn die materialisierte Ansicht vorhanden ist. Wenn der Name der materialisierten Ansicht im Dataset nicht vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.

DROP MATERIALIZED VIEW IF EXISTS mydataset.my_mv

Wenn Sie eine materialisierte Ansicht in einem anderen Projekt löschen, müssen Sie das Projekt, das Dataset und die materialisierte Ansicht im folgenden Format angeben: `project_id.dataset.materialized_view`, (einschließlich der Backticks, wenn project_id Sonderzeichen enthält); zum Beispiel `myproject.mydataset.my_mv`.

DROP FUNCTION-Anweisung

DROP FUNCTION [IF EXISTS] [[project_name.]dataset_name.]function_name

Dabei gilt:

IF EXISTS: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Funktion nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Funktion nicht vorhanden ist.

project_name ist der Name des Projekts, das die zu löschende Funktion enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

dataset_name ist der Name des Datasets, das die zu löschende Funktion enthält. Die Standardeinstellung ist defaultDataset in der Anfrage.

function_name ist der Name der Funktion, die Sie löschen möchten.

Beispiele

Mit der folgenden Beispielanweisung wird die Funktion parseJsonAsStruct im Dataset mydataset gelöscht.

DROP FUNCTION mydataset.parseJsonAsStruct;

Mit der folgenden Beispielanweisung wird die Funktion parseJsonAsStruct im Dataset sample_dataset des Projekts other_project gelöscht.

DROP FUNCTION `other_project`.sample_dataset.parseJsonAsStruct;

DROP PROCEDURE-Anweisung

DROP PROCEDURE [IF EXISTS] [[project_name.]dataset_name.]procedure_name

Dabei gilt:

IF EXISTS: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn das angegebene Verfahren nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn das angegebene Verfahren nicht vorhanden ist.

project_name ist der Name des Projekts, das das zu löschende Verfahren enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`) gesetzt werden (Beispiel: `google.com:my_project`).

dataset_name ist der Name des Datasets, das das zu löschende Verfahren enthält. Die Standardeinstellung ist defaultDataset in der Anfrage.

procedure_name ist der Name des zu löschenden Verfahrens.

Beispiele

Mit der folgenden Beispielanweisung wird die Prozedur myprocedure im Dataset mydataset gelöscht.

DROP PROCEDURE mydataset.myProcedure;

Mit der folgenden Beispielanweisung wird die Prozedur myProcedure im Dataset sample_dataset des Projekts other_project gelöscht.

DROP PROCEDURE `other-project`.sample_dataset.myprocedure;