【问题标题】:Trying to pass parameter as binding variable in snowflake statement试图在雪花语句中将参数作为绑定变量传递
【发布时间】:2020-11-11 11:47:28
【问题描述】:

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

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;
    $$;

我是不是在某个地方弄错了?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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


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

      【讨论】:

        【解决方案3】:

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

        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');
        

        【讨论】:

          【解决方案4】:

          其实是的。

          绑定变量就是这样,一个变量。所以你可以做一个

          SELECT * FRMO MY_TABLE WHERE MY_COLUMN=?

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

          var sql_cmd = "SELECT * FROM "+INPUT_TABLE;

          【讨论】:

          • 你是对的。我可以简单地使用连接,但这对我来说是另一种选择。如果您在documentation 中向下滚动到“右绑定”,您可以看到它们也将参数作为绑定变量传递。我有这个为我的另一个存储过程工作,但它在这里不起作用。我觉得这很奇怪。
          • err,对不起,你能复制粘贴这个例子吗?因为我找到了右绑定,而他们传递的是需要转换的时间戳值.....
          • 好吧,这是有道理的。我回去查看了有效的示例,它不是我传递的列名或表名。你是对的,它适用于列或表名的所有其他内容。谢谢!
          猜你喜欢
          • 2021-10-04
          • 2021-06-19
          • 2021-12-08
          • 2022-10-13
          • 1970-01-01
          • 1970-01-01
          • 2012-11-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多