klausa IDENTIFIER

Berlaku untuk:centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime 13.3 LTS ke atas

Klausul IDENTIFIER ini memungkinkan parameterisasi pengidentifikasi yang aman terhadap injeksi SQL dalam pernyataan SQL.

  • Berlaku untuk:ditandai dengan ya Databricks Runtime 18.0 ke atas

    Klausa dapat digunakan alih-alih nama objek atau pengidentifikasi apa pun dalam nama multibagian, selama argumen hanya terdiri dari string literal atau penanda parameter string. Ini termasuk string yang dikoaleskasi seperti: 'myschema' :table 'mycolumn' atau :schema :table :column.

  • Berlaku untuk:centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime 13.3 LTS ke atas

    Klausa IDENTIFIER menginterpretasikan string konstanta seperti 'myschema' || :table || 'mycolumn' atau :schema || :table || :column sebagai:

    • nama relasi (tabel atau tampilan)
    • nama fungsi
    • nama kolom
    • nama bidang
    • nama skema
    • nama katalog

    Klausul IDENTIFIER terbatas pada pernyataan berikut:

    • Nama subjek tabel, tampilan, atau fungsi dari pernyataan CREATE, ALTER, DROP, atau UNDROP.
    • Nama tabel target dari pernyataan MERGE, UPDATE, DELETE, INSERT, COPY INTO .
    • Target pernyataan SHOW atau DESCRIBE.
    • PENGGUNAAN skema atau katalog
    • Pemanggilan fungsi
    • Kolom, tabel, atau tampilan yang dirujuk dalam kueri. Ini termasuk kueri yang disematkan dalam pernyataan DDL atau DML.

Nota

IDENTIFIER Jika klausul tidak didukung dan injeksi SQL tidak menjadi perhatian, Anda dapat menggunakannya EXECUTE IMMEDIATE sebagai gantinya. Misalnya: EXECUTE IMMEDIATE 'CREATE TABLE ' || :tab || '(' || :col || 'INT)';

Sintaks

IDENTIFIER ( strLiteral )

IDENTIFIER ( strExpr )

Parameter

  • strLiteral: Literal STRING biasanya terdiri dari satu atau beberapa string penanda parameter dan komponen literal yang digabungkan.
  • strExpr: Ekspresi konstanta STRING biasanya menyertakan satu atau beberapa penanda parameter. Dimulai dengan Databricks Runtime 18.0 notasi ini tidak digunakan lagi.

Contoh

Scala

// Creation of a table using parameter marker.
spark.sql("CREATE TABLE IDENTIFIER(:mytab)(c1 INT)", args = Map("mytab" -> "tab1"))

// Altering a table with a fixed schema and a parameterized table name.
spark.sql("ALTER TABLE IDENTIFIER('default.' || :mytab) ADD COLUMN c2 INT", args = Map("mytab" -> "tab1"))

// Altering a table with a fixed schema and a parameterized table name in :re[DBR] 18.0 and above.
spark.sql("ALTER TABLE IDENTIFIER('default.' :mytab) ADD COLUMN c2 INT", args = Map("mytab" -> "tab1"))

// Dropping a table with separate schema and table parameters.
spark.sql("DROP TABLE IDENTIFIER(:myschema || '.' || :mytab)", args = Map("myschema" -> "default", "mytab" -> "tab1"))

// Dropping a table with separate schema and table parameters in :re[DBR] 18.0 and above.
spark.sql("DROP TABLE IDENTIFIER(:myschema '.' :mytab)", args = Map("myschema" -> "default", "mytab" -> "tab1"))

// A parameterized reference to a table in a query. The table name is qualified and uses back-ticks.
spark.sql("SELECT * FROM IDENTIFIER(:mytab)", args = Map("mytab" -> "`default`.`tab1`"))

// You cannot qualify the IDENTIFIER clause or use it as a qualifier itself.
spark.sql("SELECT * FROM myschema.IDENTIFIER(:mytab)", args = Map("mytab" -> "`tab1`"))

spark.sql("SELECT * FROM IDENTIFIER(:myschema).mytab", args = Map("myschema" -> "`default`"))

// A parameterized column reference
spark.sql("SELECT IDENTIFIER(:col) FROM VALUES(1) AS T(c1)", args = Map("col" -> "t.c1"))

// Passing in an aggregate function name as a parameter
spark.sql("SELECT IDENTIFIER(:agg)(c1) FROM VALUES(1), (2) AS T(c1)", args = Map("agg" -> "max"))

SQL


-- Using a catalog using a variable.
> DECLARE mycat = 'main';
> USE CATALOG IDENTIFIER(mycat);

-- Creation of a table using variable.
> DECLARE mytab = 'tab1';
> CREATE TABLE IDENTIFIER(mytab)(c1 INT);

-- Altering a table with a fixed schema and a parameterized table name.
> ALTER TABLE IDENTIFIER('default.' || mytab) ADD COLUMN c2 INT;

-- Altering a table with a fixed schema and a parameterized table name in :re[DBR] 18.0 and above.
> ALTER TABLE IDENTIFIER('default.' || mytab) ADD COLUMN c2 INT;

-- Inserting using a parameterized table name. The table name is qualified and uses back-ticks.
> SET VAR mytab = '`default`.`tab1`';
> INSERT INTO IDENTIFIER(mytab) VALUES(1, 2);

-- A parameterized reference to a table in a query.
> SELECT * FROM IDENTIFIER(mytab);
  1   2

-- Dropping a table with separate schema and table parameters.
> DECLARE myschema = 'default';
> SET VAR mytab = 'tab1';
> DROP TABLE IDENTIFIER(myschema || '.' || mytab);
-- In :re[DBR] 18.0 and above:
> DROP TABLE IDENTIFIER(myschema '.' mytab);

-- You cannot qualify the IDENTIFIER clause or use it as a qualifier itself prior to :re[DBR] 18.0.
> SELECT * FROM myschema.IDENTIFIER('tab');
Error: PARSE_SYNTAX_ERROR

> SELECT * FROM IDENTIFIER('default').mytab;
Error: PARSE_SYNTAX_ERROR

-- A parameterized column reference
> DECLARE col = 't.c1';
> SELECT IDENTIFIER(col) FROM VALUES(1) AS T(c1);
  1

-- Passing in an aggregate function name as a parameter
> DECLARE agg = 'max';
> SELECT IDENTIFIER(agg)(c1) FROM VALUES(1), (2) AS T(c1);
  2