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

时间:2019-12-13 07:08:11

标签: snowflake-data-warehouse snowflake-schema

是否可以在不限定数据库名称的情况下运行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;

5 个答案:

答案 0 :(得分:1)

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

USE DATABASE db_name;

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

答案 1 :(得分:1)

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

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

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

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

#include "MyHeaderFile.h"

func(MySecondObject()); // symbol lookup error at runtime

答案 2 :(得分:0)

我可以看到您的SQL正在访问来自其他数据库的数据,那么您已经使用对象的完全限定名称运行了SQL。

如果雪花当前会话指向对象的位置,则可以在不限定数据库名称的情况下运行SQL。

如有任何疑问,请让我知道。

非常感谢, 斯里加

答案 3 :(得分:0)

根据提供的SQL进行一点推断,您已将环境嵌入到数据库名称(DEV_XXXX_DB)中。由于每个环境中有多个数据库,这迫使您像SimonD所指出的那样,将数据库名称显式添加到每个与DB交叉的sql中。

如果您还没有发现这个问题,那么在必须使用PRD_XXXX_DB替换DEV_XXXX_DB的环境b / c之间推广代码将非常困难。

如果您不十分了解Snowflake的实现过程,建议您重新考虑您的DB.SCHEMA策略,并为每个环境(env_XXXX_DB)只创建1个DB,然后将所有包含该DB的模式(env_XXXX_DB) .STAGING,env_XXXX_DB.DIMS)。

答案 4 :(得分:0)

如果您有许多数据库,但是大多数数据来自其中一个数据库,则可以在一个数据库中创建指向另一个数据库的视图。这样,无需数据库即可查询所有对象。

即以SELECT * FROM DATABASE.SCHEMA.TABLE的形式创建VIEW MY_VIEW