是否可以在不限定数据库名称的情况下 运行 雪花 sql 脚本。?

Is it possible to run a snowflake sql script without qualifying the database name.?

是否可以 运行 SQL 脚本而不限定数据库名称? 目前,我们正在使用如下程序,

    SELECT  I.XXXX_LOC_SKEY,
            C.COUNTRY_SKEY
    FROM
            DEV_XXXX_DB.STAGING.XX_TABLE_LOCATION_SALES         F,
            DEV_XXXX_PRESENTATION_DB.DIMS.XXXX_LOCATIONS_D      I,
            DEV_XXXX_PRESENTATION_DB.DIMS.COUNTRY_D             C,
            DEV_XXXX_PRESENTATION_DB.DIMS.XXXX_DAILY_CALENDAR_D H
    WHERE
            F.STORE_CODE       = I.DOOR
    AND     I.CHANNEL          = 'XXXX'
    AND     F.COUNTRY          = C.COUNTRY_CODE
    AND     I.COUNTRY_SKEY     = C.COUNTRY_SKEY
    AND     F.DATE = H.DATE;

我们想要 运行 相同的脚本,但不提及下面的数据库名称。

    SELECT  I.XXXX_LOC_SKEY,
            C.COUNTRY_SKEY
    FROM
            STAGING.XX_TABLE_LOCATION_SALES         F,
            DIMS.XXXX_LOCATIONS_D                   I,
            DIMS.COUNTRY_D                          C,
            DIMS.XXXX_DAILY_CALENDAR_D              H
    WHERE
            F.STORE_CODE       = I.DOOR
    AND     I.CHANNEL          = 'XXXX'
    AND     F.COUNTRY          = C.COUNTRY_CODE
    AND     I.COUNTRY_SKEY     = C.COUNTRY_SKEY
    AND     F.DATE = H.DATE;

我可以看到您的 SQL 从不同的数据库访问数据,然后您 运行 SQL 具有完全限定的对象名称。

如果 snowflake 当前会话指向对象的位置,那么您可以 运行 SQL 而无需限定数据库名称。

尽管雪花 Web GUI 会记住您的上一个数据库,以及其他例如。 ETL 工具可以为连接配置默认数据库,Snowflake 没有默认数据库的概念。包括 Web GUI 在内的所有工具都必须根据工具配置发出以下命令来设置数据库:

USE DATABASE db_name;

如果要避免在命令中引用数据库,必须在会话中预先使用 USE DATABASE 命令。

根据提供的 SQL 稍作推断,您已将环境嵌入到数据库名称 (DEV_XXXX_DB) 中。由于每个环境有多个数据库,这迫使您显式地将数据库名称添加到每个 sql 中,正如 SimonD 所指出的那样。

如果您还没有发现这一点,那么您将很难在环境 b/c 之间推广代码,您必须将 DEV_XXXX_DB 替换为 PRD_XXXX_DB.

如果您在 Snowflake 实施过程中还没有走得太远,我建议您重新考虑您的 DB.SCHEMA 策略并为每个环境创建 1 个数据库 (env_XXXX_DB) 并将所有架构 w/in 数据库 (env_XXXX_DB.STAGING, env_XXXX_DB.DIMS).

这是解决不合格对象的方式:

https://docs.snowflake.net/manuals/sql-reference/name-resolution.html

请注意,您可以自定义 SEARCH_PATH 以搜索多个架构。

或者,您可以将完全限定名称放入变量中:

set f = 'DEV_XXXX_DB.STAGING.XX_TABLE_LOCATION_SALES';

select f.* from table($f) f;

select f.* from identifier($f) f;

如果您有多个数据库,但大部分数据都来自其中一个,则可以在一个数据库中创建指向另一个数据库的视图。这样就可以在不需要数据库的情况下查询所有对象。

即创建视图 MY_VIEW 作为 SELECT * 来自 DATABASE.SCHEMA.TABLE