使用設定 YAML 檔案轉換 SQL 翻譯

本文說明如何使用 YAML 設定檔,在將 SQL 程式碼遷移至 BigQuery 時轉換該程式碼。這份指南提供建立專屬設定 YAML 檔案的指引,並提供這項功能支援的各種翻譯轉換範例。

使用 BigQuery 互動式 SQL 翻譯器BigQuery Migration API 或執行批次 SQL 翻譯時,您可以提供 YAML 設定檔來修改 SQL 查詢翻譯。使用 YAML 設定檔,可進一步自訂來源資料庫的 SQL 查詢翻譯作業。

您可以透過下列方式,指定要在 SQL 轉譯作業中使用的設定 YAML 檔案:

互動式 SQL 翻譯器、BigQuery Migration API、批次 SQL 翻譯器和批次翻譯 Python 用戶端,都支援在單一翻譯工作中,使用多個 YAML 設定檔。詳情請參閱套用多個 YAML 設定

設定 YAML 檔案規定

建立 YAML 設定檔前,請先詳閱下列資訊,確保 YAML 檔案與 BigQuery 遷移服務相容:

  • 您必須將設定 YAML 檔案上傳至 Cloud Storage bucket 的根目錄,該 bucket 包含 SQL 轉譯輸入檔案。如要瞭解如何建立 bucket 並將檔案上傳至 Cloud Storage,請參閱「建立 bucket」和「從檔案系統上傳物件」。
  • 單一設定 YAML 檔案的大小不得超過 1 MB。
  • 單一 SQL 轉譯作業中使用的所有設定 YAML 檔案,總大小不得超過 4 MB。
  • 如果使用 regex 語法進行名稱比對,請使用 RE2/J
  • 所有設定 YAML 檔案名稱都必須包含 .config.yaml 副檔名,例如 change-case.config.yaml
    • 設定檔名稱不能只有 config.yaml

建立設定 YAML 檔案的指南

本節提供建立設定 YAML 檔案的一般準則:

每個設定檔都必須包含標頭,指定設定類型。object_rewriter 類型用於在設定 YAML 檔案中指定 SQL 翻譯。下列範例使用 object_rewriter 型別轉換名稱大小寫:

type: object_rewriter
global:
  case:
    all: UPPERCASE

選取實體

如要執行實體專屬轉換,請在設定檔中指定實體。所有 match 屬性都是選用屬性,請只使用轉換所需的 match 屬性。下列設定 YAML 會公開要比對的屬性,以便選取特定實體:

match:
  database: <literal_name>
  schema: <literal_name>
  relation: <literal_name>
  attribute: <literal_name>
  databaseRegex: <regex>
  schemaRegex: <regex>
  relationRegex: <regex>
  attributeRegex: <regex>

各項 match 屬性的說明:

  • databasedb:project_id 元件。
  • schema:資料集元件。
  • relation:資料表元件。
  • attribute:資料欄元件。僅適用於屬性選取
  • databaseRegexdbRegex:使用規則運算式比對 database 屬性 (預覽)。
  • schemaRegex:將 schema 屬性與規則運算式比對 (預覽)。
  • relationRegex:使用規則運算式比對 relation 屬性 (預覽)。
  • attributeRegex:使用規則運算式比對 attribute 屬性。僅適用於屬性選取 (預覽)。

舉例來說,下列設定 YAML 會指定 match 屬性,以選取 testdb.acme.employee 資料表進行暫時性資料表轉換。

type: object_rewriter
relation:
-
  match:
    database: testdb
    schema: acme
    relation: employee
  temporary: true

您可以使用 databaseRegexschemaRegexrelationRegexattributeRegex 屬性指定規則運算式,選取實體子集。以下範例會將 testdbtmp_schema 架構的所有關係變更為暫時,只要名稱開頭為 tmp_ 即可:

type: object_rewriter
relation:
-
  match:
    schema: tmp_schema
    relationRegex: "tmp_.*"
  temporary: true

系統會以不區分大小寫的方式比對文字和 regex 屬性。如要強制執行區分大小寫的相符項目,請使用 regex 並停用 i 標記,如下列範例所示:

match:
  relationRegex: "(?-i:<actual_regex>)"

您也可以使用對應的短字串語法,指定完整實體。短字串語法應包含以半形句點分隔的 3 個 (用於關係選取) 或 4 個 (用於屬性選取) 名稱區段,如範例 testdb.acme.employee 所示。然後,系統會從內部解讀這些區隔,就像是分別以 databaseschemarelationattribute 傳遞一樣。這表示系統會比對名稱的字面值,因此簡短語法不允許使用規則運算式。以下範例說明如何使用短字串語法,在設定 YAML 檔案中指定完整實體:

type: object_rewriter
relation:
-
  match : "testdb.acme.employee"
  temporary: true

如果資料表名稱含有半形句號,您就無法使用簡短語法指定名稱。在這種情況下,您必須使用物件比對。以下範例會將 testdb.acme.stg.employee 資料表變更為暫時性:

type: object_rewriter
relation:
-
  match:
    database: testdb
    schema: acme
    relation: stg.employee
  temporary: true

設定 YAML 接受 key 做為 match 的別名。

預設資料庫

部分輸入 SQL 方言 (特別是 Teradata) 不支援合格名稱中的 database-name。在這種情況下,最簡單的實體比對方式是在 match 中省略 database 屬性。

不過,您可以設定 BigQuery Migration Service 的 default_database 屬性,並在 match 中使用該預設資料庫。

支援的目標屬性類型

您可以使用設定 YAML 檔案執行屬性類型轉換,將資料欄的資料類型從來源類型轉換為目標類型。設定 YAML 檔案支援下列目標類型:

  • BOOLEAN
  • TINYINT
  • SMALLINT
  • INTEGER
  • BIGINT
  • FLOAT
  • DOUBLE
  • NUMERIC (支援選用的總位數和小數位數,例如 NUMERIC(18, 2))
  • TIME
  • TIMETZ
  • DATE
  • DATETIME
  • TIMESTAMP
  • TIMESTAMPTZ
  • CHAR (支援選用精確度,例如 CHAR(42))
  • VARCHAR (支援選用精確度,例如 VARCHAR(42))

設定 YAML 範例

本節提供範例,說明如何建立各種設定 YAML 檔案,以搭配 SQL 翻譯使用。每個範例都會簡要說明,如何使用 YAML 語法以特定方式轉換 SQL 翻譯。每個範例也提供 teradata-input.sqlhive-input.sql 檔案和 bq-output.sql 檔案的內容,方便您比較設定檔 YAML 對 BigQuery SQL 查詢轉譯的影響。

下列範例使用 Teradata 或 Hive 做為輸入 SQL 方言,並以 BigQuery SQL 做為輸出方言。下列範例也使用 testdb 做為預設資料庫,並使用 testschema 做為結構定義搜尋路徑。

變更物件名稱大小寫

下列設定 YAML 會變更物件名稱的大小寫:

type: object_rewriter
global:
  case:
    all: UPPERCASE
    database: LOWERCASE
    attribute: LOWERCASE

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
      create table x(a int);
      select * from x;
    
bq-output.sql
      CREATE TABLE testdb.TESTSCHEMA.X
      (
        a INT64
      )
      ;
      SELECT
          X.a
        FROM
          testdb.TESTSCHEMA.X
      ;
    

將資料表設為暫時

下列設定 YAML 會將一般資料表變更為暫時性資料表

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    temporary: true

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
    create table x(a int);
    
bq-output.sql
    CREATE TEMPORARY TABLE x
    (
      a INT64
    )
    ;
    

將資料表設為暫時性

下列設定 YAML 會將一般資料表變更為暫時性資料表,並設定 60 秒的到期時間。

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    ephemeral:
      expireAfterSeconds: 60

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
    create table x(a int);
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a INT64
    )
    OPTIONS(
      expiration_timestamp=timestamp_add(current_timestamp(), interval 60 SECOND)
    );
    

設定分區有效期限

下列設定 YAML 會將分區資料表的到期時間變更為 1 天:

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    partitionLifetime:
      expireAfterSeconds: 86400

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
    create table x(a int, b int) partition by (a);
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a INT64,
      b INT64
    )
    CLUSTER BY a
    OPTIONS(
      partition_expiration_days=1
    );
    

變更表格的外部位置或格式

下列設定 YAML 會變更資料表的外部分位和格式

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    external:
      locations: "gs://path/to/department/files"
      format: ORC

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
    create table x(a int);
    
bq-output.sql
    CREATE EXTERNAL TABLE testdb.testschema.x
    (
      a INT64
    )
    OPTIONS(
      format='ORC',
      uris=[
        'gs://path/to/department/files'
      ]
    );
    

設定或變更資料表說明

下列 YAML 設定會設定表格的說明:

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    description:
      text: "Example description."

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
    create table x(a int);
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a INT64
    )
    OPTIONS(
      description='Example description.'
    );
    

設定或變更資料表分割區

下列設定 YAML 會變更資料表的分區配置

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    partition:
      simple:
        add: [a]
  -
    match: "testdb.testschema.y"
    partition:
      simple:
        remove: [a]

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
    create table x(a date, b int);
    create table y(a date, b int) partition by (a);
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a DATE,
      b INT64
    )
    PARTITION BY a;
    CREATE TABLE testdb.testschema.y
    (
      a DATE,
      b INT64
    )
    ;
    

設定或變更資料表叢集

下列設定 YAML 會變更資料表的叢集架構

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    clustering:
      add: [a]
  -
    match: "testdb.testschema.y"
    clustering:
      remove: [b]

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

hive-input.sql
    create table x(a int, b int);
    create table y(a int, b int) clustered by (b) into 16 buckets;
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a INT64,
      b INT64
    )
    CLUSTER BY a;
    CREATE TABLE testdb.testschema.y
    (
      a INT64,
      b INT64
    )
    ;
    

變更資料欄屬性的類型

下列設定 YAML 會變更資料欄屬性的資料類型:

type: object_rewriter
attribute:
  -
    match:
      database: testdb
      schema: testschema
      attributeRegex: "a+"
    type:
      target: NUMERIC(10,2)

您可以將來源資料類型轉換為任何支援的目標屬性類型

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
    create table x(a int, b int, aa int);
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a NUMERIC(31, 2),
      b INT64,
      aa NUMERIC(31, 2)
    )
    ;
    

新增外部資料湖的連線

下列設定 YAML 會將來源資料表標示為外部資料表,指向儲存在外部資料湖中的資料,並由資料湖連線指定。

type: object_rewriter
relation:
-
  key: "testdb.acme.employee"
  external:
    connection_id: "connection_test"

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

hive-input.sql
    CREATE TABLE x
    (
      a VARCHAR(150),
      b INT
    );
    
bq-output.sql
    CREATE EXTERNAL TABLE x
    (
      a STRING,
      b INT64
    )
    WITH CONNECTION `connection_test`
    OPTIONS(
    );
    

變更輸入檔案的字元編碼

根據預設,BigQuery 遷移服務會嘗試自動偵測輸入檔案的字元編碼。如果 BigQuery 遷移服務可能誤判檔案的編碼,您可以使用 YAML 設定檔明確指定字元編碼。

下列設定 YAML 會將輸入檔案的明確字元編碼指定為 ISO-8859-1

type: experimental_input_formats
formats:
- source:
    pathGlob: "*.sql"
  contents:
    raw:
      charset: iso-8859-1

全域類型轉換

下列設定 YAML 會在所有指令碼中將資料類型變更為其他類型,並指定要避免在轉譯指令碼中使用的來源資料類型。這與「變更資料欄屬性的類型」設定不同,後者只會變更單一屬性的資料類型。

BigQuery 支援下列資料類型轉換:

  • DATETIMETIMESTAMP
  • TIMESTAMPDATETIME (接受選用時區)
  • TIMESTAMP WITH TIME ZONEDATETIME (接受選用時區)
  • CHARVARCHAR

在下列範例中,設定 YAML 會將 TIMESTAMP 資料型別轉換為 DATETIME

type: experimental_object_rewriter
global:
  typeConvert:
    timestamp: DATETIME

在 Teradata 等方言中,current_datecurrent_timecurrent_timestamp 等日期時間相關函式會根據設定的時區 (當地或工作階段) 傳回時間戳記。另一方面,BigQuery 一律會以世界標準時間傳回時間戳記。為確保兩種方言的行為一致,請務必相應設定時區。

在下列範例中,設定 YAML 會將 TIMESTAMPTIMESTAMP WITH TIME ZONE 資料類型轉換為 DATETIME,並將目標時區設為 Europe/Paris

type: experimental_object_rewriter
global:
  typeConvert:
    timestamp:
      target: DATETIME
      timezone: Europe/Paris
    timestamptz:
      target: DATETIME
      timezone: Europe/Paris

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
      create table x(a timestamp);
      select a from x where a > current_timestamp(0);
    
bq-output.sql
      CREATE TABLE x
      (
        a TIMESTAMP
      )
      ;
      SELECT
          x.a
        FROM
          test.x
        WHERE x.a > datetime_trunc(current_datetime('Europe/Paris'), SECOND)
      ;
    

選取對帳單修改

下列設定 YAML 會變更 SELECT 陳述式中的星號投影 GROUP BYORDER BY 子句。

starProjection 支援下列設定:

  • ALLOW
  • PRESERVE (預設)
  • EXPAND

groupByorderBy 支援下列設定:

  • EXPRESSION
  • ALIAS
  • INDEX

在下列範例中,設定 YAML 會將星形投影設定為 EXPAND

type: experimental_statement_rewriter
select:
  starProjection: EXPAND

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
      create table x(a int, b TIMESTAMP);
      select * from x;
    
bq-output.sql
      CREATE TABLE x
      (
        a INT64,
        b DATETIME
      )
      ;
      SELECT
          x.a
          x.b
        FROM
          x
      ;
    

UDF 規格

下列設定 YAML 會指定來源指令碼中使用的使用者定義函式 (UDF) 簽章。與中繼資料 ZIP 檔案類似,UDF 定義有助於更準確地翻譯輸入指令碼。

type: metadata
udfs:
  - "date parse_short_date(dt int)"

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
      create table x(dt int);
      select parse_short_date(dt) + 1 from x;
    
bq-output.sql
      CREATE TABLE x
      (
        dt INT64
      )
      ;
      SELECT
          date_add(parse_short_date(x.dt), interval 1 DAY)
        FROM
          x
      ;
    

設定小數精確度嚴格程度

根據預設,BigQuery 遷移服務會將數值精確度提高至特定比例可用的最高精確度。下列設定 YAML 會將精確度嚴格程度設為保留來源陳述式的小數精確度,藉此覆寫這項行為。

type: experimental_statement_rewriter
common:
  decimalPrecision: STRICT

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
      create table x(a decimal(3,0));
    
bq-output.sql
      CREATE TABLE x
      (
        a NUMERIC(3)
      )
      ;
    

輸出名稱對應

您可以使用設定 YAML 對應 SQL 物件名稱。您可以根據對應的物件,變更名稱的不同部分。

靜態名稱對應

使用靜態名稱對應來對應實體的名稱。如果只想變更名稱的特定部分,並保留其他部分,請只加入需要變更的部分。

下列設定 YAML 會將資料表名稱從 my_db.my_schema.my_table 變更為 my_new_db.my_schema.my_new_table

type: experimental_object_rewriter
relation:
-
  match: "my_db.my_schema.my_table"
  outputName:
    database: "my_new_db"
    relation: "my_new_table"

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
      create table my_db.my_schema.my_table(a int);
    
bq-output.sql
      CREATE TABLE my_new_db.my_schema.my_new_table
      (
        a INT64
      )
    

您可以使用靜態名稱對應,更新公開使用者定義函式中名稱使用的區域。

以下範例會變更 bqutil.fn UDF 中的名稱,從使用預設的 us 多區域改為使用 europe_west2 區域:

type: experimental_object_rewriter
function:
-
  match:
    database: bqutil
    schema: fn
  outputName:
    database: bqutil
    schema: fn_europe_west2

動態名稱對應

使用動態名稱對應功能,同時變更多個物件,並根據對應的物件建立新名稱。

下列設定 YAML 會為屬於 staging 結構定義的所有資料表加上 stg_ 前置字元,藉此變更資料表名稱,然後將這些資料表移至 production 結構定義。

type: experimental_object_rewriter
relation:
-
  match:
    schema: staging
  outputName:
    schema: production
    relation: "stg_${relation}"

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
      create table staging.my_table(a int);
    
bq-output.sql
      CREATE TABLE production.stg_my_table
      (
        a INT64
      )
      ;
    

指定預設資料庫和結構定義搜尋路徑

下列設定 YAML 會指定預設資料庫結構定義搜尋路徑

type: environment
session:
  defaultDatabase: myproject
  schemaSearchPath: [myschema1, myschema2]

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
      SELECT * FROM database.table
      SELECT * FROM table1
    
bq-output.sql
      SELECT * FROM myproject.database.table.
      SELECT * FROM myproject.myschema1.table1
    

全域輸出名稱改寫

下列設定 YAML 會根據設定的規則,變更指令碼中所有物件 (資料庫、結構定義、關聯和屬性) 的輸出名稱。

type: experimental_object_rewriter
global:
  outputName:
    regex:
      - match: '\s'
        replaceWith: '_'
      - match: '>='
        replaceWith: 'gte'
      - match: '^[^a-zA-Z_].*'
        replaceWith: '_$0'

使用這個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
      create table "test special chars >= 12"("42eid" int, "custom column" varchar(10));
    
bq-output.sql
      CREATE TABLE test_special_chars_employees_gte_12
      (
        _42eid INT64,
        custom_column STRING
      )
      ;
    

最佳化並提升翻譯後 SQL 的效能

您可以視需要對翻譯後的 SQL 進行轉換,以導入可提升查詢效能或降低查詢成本的變更。這些最佳化作業嚴格來說取決於案例,應根據未修改的 SQL 輸出內容進行評估,以評估對效能的實際影響。

下列設定 YAML 可啟用選用轉換作業。設定接受最佳化清單,以及接受參數的最佳化項目,並提供選用參數值的區段。

type: optimizer
transformations:
  - name: PRECOMPUTE_INDEPENDENT_SUBSELECTS
  - name: REWRITE_CTE_TO_TEMP_TABLE
    parameters:
      threshold: 1
最佳化 選用參數 說明
PRECOMPUTE_INDEPENDENT_SUBSELECTS scope: [PREDICATE, PROJECTION] 新增 DECLARE 陳述式,取代 PREDICATE 子句或 PROJECTION 中的運算式,並使用預先計算的變數,藉此重新編寫查詢。這會識別為靜態述詞,可減少讀取的資料量。如果省略範圍,預設值為 PREDICATE (即 WHEREJOIN-ON 子句)。

將純量子查詢擷取至 DECLARE 陳述式 會使原始述詞成為靜態,因此符合改善執行計畫的資格。這項最佳化作業會導入新的 SQL 陳述式。
REWRITE_CTE_TO_TEMP_TABLE threshold: N 如果對同一個一般資料表運算式的參照超過 N 個,就會將一般資料表運算式 (CTE) 重寫為臨時資料表。這可降低查詢複雜度,並強制執行通用資料表運算式。如省略 N,預設值為 4。

如果多次參照非微不足道的 CTE,建議使用這項最佳化功能。 導入暫時性資料表會產生額外負擔,可能大於最終多次執行低複雜度或低基數 CTE 的負擔。這項最佳化作業會導入新的 SQL 陳述式。
REWRITE_ZERO_SCALE_NUMERIC_AS_INTEGER bigint: N 如果精確度在 N 範圍內,系統會將零比例 NUMERIC/BIGNUMERIC 屬性重新編寫為 INT64 類型。如未填寫此欄位,則預設值為 18N

如果來源方言沒有整數型別,建議使用這項最佳化功能。變更資料欄類型時,必須檢查所有下游用途,確認類型相容性和語意變更。舉例來說,分數除法變成整數除法,程式碼預期會出現數值
DROP_TEMP_TABLE 為指令碼中建立的所有暫時資料表新增 DROP TABLE 陳述式,且不會在指令碼結尾捨棄這些資料表。這會將臨時資料表的儲存空間計費週期從 24 小時縮短為指令碼執行時間。這項最佳化作業會導入新的 SQL 陳述式。

如果指令碼執行完畢後,暫時性資料表不會用於任何後續處理作業,建議使用這項最佳化功能。這項最佳化作業會導入新的 SQL 陳述式。
REGEXP_CONTAINS_TO_LIKE 將部分類別的 REGEXP_CONTAINS 模式重新編寫為 LIKE 運算式。

如果沒有其他程序 (例如巨集取代) 依賴輸出 SQL 中保留不變的正規運算式模式常值,建議使用這項最佳化功能。
ADD_DISTINCT_TO_SUBQUERY_IN_SET_COMPARISON DISTINCT 子句新增至用做 [NOT] IN 運算子值集的子查詢。

如果子查詢結果的基數 (相異值的數量) 遠低於值的數量,建議使用這項最佳化功能。如果未滿足這項前提條件,這項轉換可能會對效能造成負面影響。

建立以 Gemini 為基礎的設定 YAML 檔案

如要生成 AI 輸出內容,包含 SQL 轉譯輸入內容的來源目錄必須包含設定 YAML 檔案。

需求條件

AI 輸出內容的設定 YAML 檔案必須加上 .ai_config.yaml 後置字元。 例如:rules_1.ai_config.yaml

支援的欄位

您可以使用下列欄位設定 AI 翻譯輸出內容:

  • suggestion_type (選用):指定要生成的 AI 建議類型。 系統支援下列建議類型:
    • QUERY_CUSTOMIZATION (預設):根據設定 YAML 檔案中指定的轉譯規則,生成 SQL 程式碼的 AI 建議。
    • TRANSLATION_EXPLANATION:產生文字,包括翻譯後的 GoogleSQL 查詢摘要,以及來源 SQL 查詢與翻譯後的 GoogleSQL 查詢之間的差異和不一致之處。
  • rewrite_target (選用):如要將轉譯規則套用至輸入的 SQL,請指定 SOURCE_SQL;如要將轉譯規則套用至輸出的 SQL,請指定 TARGET_SQL (預設)。
  • instruction (選用):以自然語言說明目標 SQL 的變更。已啟用 Gemini 的 SQL 轉譯功能會評估要求,並進行指定的變更。
  • examples (選用):提供 SQL 範例,說明您希望如何修改 SQL 模式。

你可以視需要新增其他 translation_rulesexamples

範例

以下範例會建立以 Gemini 為基礎的設定 YAML 檔案,可用於 SQL 轉譯。

在預設翻譯輸出查詢中移除 upper 函式

translation_rules:
- instruction: "Remove upper() function"
  examples:
  - input: "upper(X)"
    output: "X"

建立多個翻譯規則,自訂翻譯輸出內容

translation_rules:
- instruction: "Remove upper() function"
  suggestion_type: QUERY_CUSTOMIZATION
  rewrite_target: TARGET_SQL
  examples:
  - input: "upper(X)"
    output: "X"
- instruction: "Insert a comment at the head that explains each statement in detail.
  suggestion_type: QUERY_CUSTOMIZATION
  rewrite_target: TARGET_SQL

從翻譯輸入查詢中移除 SQL 註解

translation_rules:
- instruction: "Remove all the sql comments in the input sql query."
  suggestion_type: QUERY_CUSTOMIZATION
  rewrite_target: SOURCE_SQL

使用預設 LLM 提示生成翻譯說明

這個範例使用翻譯服務提供的預設 LLM 提示,生成文字說明:

translation_rules:
- suggestion_type: "TRANSLATION_EXPLANATION"

使用自然語言提示生成翻譯說明

translation_rules:
- suggestion_type: "TRANSLATION_EXPLANATION"
  instruction: "Explain the syntax differences between the source Teradata query and the translated GoogleSQL query."

單一設定 YAML 檔案中的多個建議類型

translation_rules:
- suggestion_type: "TRANSLATION_EXPLANATION"
  instruction: "Explain the syntax differences between the source Teradata query and the translated GoogleSQL query."
- instruction: "Remove upper() function"
  suggestion_type: QUERY_CUSTOMIZATION
  rewrite_target: TARGET_SQL
  examples:
  - input: "upper(X)"
    output: "X"
- instruction: "Remove all the sql comments in the input sql query."
  suggestion_type: QUERY_CUSTOMIZATION
  rewrite_target: SOURCE_SQL

套用多個 YAML 設定

在批次或互動式 SQL 翻譯中指定設定 YAML 檔案時,您可以在單一翻譯工作中選取多個設定 YAML 檔案,以反映多項轉換。如果多項設定發生衝突,一項轉換作業可能會覆寫另一項。建議您在每個檔案中使用不同類型的設定,以免在同一個翻譯工作中發生轉換衝突。

下列範例列出為單一 SQL 轉譯工作提供的兩個獨立設定 YAML 檔案,一個用於變更資料欄的屬性,另一個則用於將資料表設為暫時:

change-type-example.config.yaml

type: object_rewriter
attribute:
  -
    match: "testdb.testschema.x.a"
    type:
      target: NUMERIC(10,2)

make-temp-example.config.yaml

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    temporary: true

使用這兩個設定 YAML 檔案的 SQL 翻譯可能如下所示:

teradata-input.sql
    create table x(a int);
    
bq-output.sql
    CREATE TEMPORARY TABLE x
    (
      a NUMERIC(31, 2)
    )
    ;