Stored procedures 尝试在snowflake语句中将参数作为绑定变量传递

Stored procedures 尝试在snowflake语句中将参数作为绑定变量传递,stored-procedures,snowflake-cloud-data-platform,bind-variables,Stored Procedures,Snowflake Cloud Data Platform,Bind Variables,下面是我的存储过程,我不确定它为什么一直抛出错误。我得到的错误是 SQL编译错误:语法错误行XX位于XX位置意外的“?” 我遵循了文档,但它似乎对我不起作用 这就是我所拥有的: CREATE OR REPLACE PROCEDURE spExample(INPUT_TABLE VARCHAR) RETURNS VARCHAR LANGUAGE JAVASCRIPT AS $$ result = ""; try {

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

SQL编译错误:语法错误行XX位于XX位置意外的“?”

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

这就是我所拥有的:

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;
    $$;
我在什么地方出错了吗?

事实上是的

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

选择*FRMO我的表格,其中我的列=?

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


var sql\u cmd=“SELECT*FROM”+输入表

似乎我和OP有着完全相同的误解。找到这个答案很好

在任何情况下,使用反勾号(而不是使用单引号或双引号)使用JavaScript模板文本都更灵活、可读性更强。它们允许您使用以下格式的表达式插值:

`这里有一些文本${expression}这里还有一些文本`

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

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



var sql_cmd=“从标识符('?');”中选择*

以下是我尝试过的,它执行得非常完美:

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

你说得对。我可以简单地使用连接,但这是我的选择。如果在中向下滚动到“right bind”,则可以看到它们也将参数作为绑定变量传递。我的另一个存储过程可以使用它,但它在这里不起作用。我觉得很奇怪。呃,对不起,你能复制粘贴这个例子吗?因为我找到了正确的绑定,它们传递的是需要转换的时间戳值……好吧,这很有意义。我回头看了一个有效的例子,我传递的不是列名或表名。你是对的,它适用于除列或表名以外的所有其他名称。非常感谢。