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