使用設定 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 Migration Service 相容:

  • 您必須將設定 YAML 檔案上傳至包含 SQL 翻譯輸入檔案的 Cloud Storage 值區根目錄。如要瞭解如何建立值區及將檔案上傳至 Cloud Storage,請參閱「建立值區」和「從檔案系統上傳物件」。
  • 單一設定 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 屬性。僅適用於屬性選取 (Preview)。

舉例來說,下列設定 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 Migration Service 可能誤判檔案的編碼,您可以使用 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 Migration Service 會將數值精確度提高至特定比例可用的最高精確度。下列設定 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 會將前置字串 stg_ 新增至屬於 staging 結構定義的資料表,藉此變更所有資料表的名稱,然後將這些資料表移至 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 類型。如果省略 N,預設值則為 18

建議您在從沒有整數類型的來源方言進行翻譯時,使用這項最佳化功能。如要變更資料欄類型,您必須檢查所有下游用途,以便確認類型相容性和語意變更。例如,小數分數變成整數分數、程式碼預期的值為數值
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)
    )
    ;