在雪花中绑定变量时标识符无效

Invalid identifier when binding variables in snowflake

我创建了一个存储过程,它从 table 获取某些值并将这些值用于另一个 sql 查询 但是我成功地获得了我需要的值 我不断收到我通过绑定传递的值的无效标识符 下面是我的代码片段

    var v_role       = sqlRS1.getColumnValue(1);
    var v_database   = sqlRS1.getColumnValue(2);
    var v_schema     = sqlRS1.getColumnValue(3);
    var v_table      = sqlRS1.getColumnValue(4);
    var v_column     = sqlRS1.getColumnValue(5);
    
    var v_tableColumn = v_table + `_` + v_column;
        
    var v_sqlCode5 = `SELECT * 
                      FROM  db.sch.tbl  
                      WHERE DATABASE_NAME = identifier(?) 
                      AND   SCHEMA_NAME   = identifier(?)  
                      AND   POLICY_NAME IN (identifier(?))`;
                     
    var sqlStmt2 = snowflake.createStatement({sqlText:v_sqlCode5,binds:[v_database,v_schema,v_tableColumn]});
    var sqlRS2   = sqlStmt2.execute();

该错误将指出 DATABASE_NAME 中传递的值的标识符无效 我检查了查询历史,发现传递的值是正确的 所以我不确定如何解决这个问题,任何帮助将不胜感激

Identifiers are using to replace table names (which can been seen in this example)。你所拥有的看起来应该是正常的平等加入:

另一种说法是您生成的 SQL:

SELECT * FROM DB.SCH.TBL 
WHERE DATABASE_NAME = identifier('AD') 
    AND SCHEMA_NAME = identifier('DB') 
    AND POLICY_NAME IN (identifier('M_E'));

这个 运行 在 UI 中对你来说没有错误吗?

我怀疑您需要将其更改为:

SELECT * FROM DB.SCH.TBL 
WHERE DATABASE_NAME = 'AD'
    AND SCHEMA_NAME = 'DB'
    AND POLICY_NAME IN ('M_E');

让它发挥作用。

您需要的是确保传入的值被完整引用。所以事情不会逃脱,这是我对将它们作为绑定变量传递的理解。

这意味着您的来源应该是:

    var v_sqlCode5 = `SELECT * 
                      FROM  db.sch.tbl  
                      WHERE DATABASE_NAME = ?
                      AND   SCHEMA_NAME   = ? 
                      AND   POLICY_NAME IN (?)`;