下面是我的存储过程,我不确定为什么它总是抛出错误。我得到的错误是
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;
$$;
我在某个地方犯了错误吗?
答案 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.`
只需填写您的一个或多个变量(或表达式)。