尝试将参数作为雪花语句中的绑定变量传递

时间:2020-07-22 02:00:19

标签: stored-procedures snowflake-cloud-data-platform bind-variables

下面是我的存储过程,我不确定为什么它总是抛出错误。我得到的错误是

SQL编译错误:位置XX处的语法错误第XX行出现意外的'?'。

我遵循了文档here,但它似乎对我不起作用。

这就是我所拥有的:

CREATE OR REPLACE PROCEDURE spExample(INPUT_TABLE VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    result = "";
    try {
        var sql_cmd = "SELECT * FROM ?;";
        var sql_stmt = snowflake.createStatement({sqlText: sql_cmd, binds:[INPUT_TABLE]});
        sql_stmt.execute();
    } catch(err) {
        result += "Message: " + err.message;
    }
    return result;
    $$;

我在某个地方犯了错误吗?

4 个答案:

答案 0 :(得分:1)

实际上是。

绑定变量就是那个变量。所以你可以做一个

SELECT * FRMO MY_TABLE WHERE MY_COLUMN=?

,但是您不能使用bind代替命令或列或表名。但是,您可以使用简单的JS串联,例如

var sql_cmd = "SELECT * FROM "+INPUT_TABLE;

答案 1 :(得分:1)

以上答案会使您的代码受到 sql 注入攻击。当然,您可以将表名绑定到雪花中的变量。


var sql_cmd = "SELECT * FROM IDENTIFIER('?');";

答案 2 :(得分:1)

这是我尝试过的,它完美地执行了:

CREATE OR REPLACE PROCEDURE spExample(INPUT_TABLE VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    result = "";
    try {
        var sql_cmd = "SELECT * FROM IDENTIFIER(?);";
        var sql_stmt = snowflake.createStatement({sqlText: sql_cmd, binds:[INPUT_TABLE]});
        sql_stmt.execute();
    } catch(err) {
               result += "Message: " + err.message;
    }
    return result;
    $$;
Call spExample('PAIDBILLS');

答案 3 :(得分:-1)

看来我和 OP 有完全相同的误解。很高兴找到这个答案。

在任何情况下,使用反引号(而不是使用单引号或双引号)的 JavaScript 模板文字会更加灵活和更具可读性。它们允许您使用

格式的表达式插值
`Some text here. ${expression} Some more text here.`

只需填写您的一个或多个变量(或表达式)。