设置变量存储小写表名,调用时为何被转为大写?
原因说明
- 你所用的数据库(典型如Snowflake、Oracle)默认对未加双引号的标识符采用大小写不敏感匹配规则,会自动将标识符转换为大写后再和系统内存储的对象名做匹配
- 虽然你的变量中存储的确实是小写的
tab_name,但当变量被作为表名标识符传入table()函数时,会触发上述标识符转换逻辑,被自动转为大写的TAB_NAME,如果你的表是当初用双引号包裹创建的小写名,自然会匹配失败报错。
解决方案
方案1:变量赋值时直接包裹双引号
设置变量时就给表名套上双引号,强制数据库识别为大小写敏感的标识符:
Set TGT_TABLE = '"tab_name"'; -- 后续查询直接正常调用即可 select * from table($TGT_TABLE);
方案2:查询时动态拼接双引号
如果不想修改原有变量赋值逻辑,可在查询时通过字符串拼接给变量值套双引号,再用标识符函数转换:
-- 原有变量赋值不变 Set TGT_TABLE = 'tab_name'; -- 查询时处理大小写 select * from identifier('"' || $TGT_TABLE || '"');
方案3:统一对象名大小写规范
如果没有业务强制要求小写表名,后续创建表时不要使用双引号包裹表名,让表名默认以大写形式存储在系统中,就不会再出现大小写不匹配的问题。
内容的提问来源于stack exchange,提问作者OUMOUSS_ELMEHDI
相关产品推荐
相关产品推荐

