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