Stored procedures 尝试在snowflake语句中将参数作为绑定变量传递
下面是我的存储过程,我不确定它为什么一直抛出错误。我得到的错误是 SQL编译错误:语法错误行XX位于XX位置意外的“?” 我遵循了文档,但它似乎对我不起作用 这就是我所拥有的: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 {
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”,则可以看到它们也将参数作为绑定变量传递。我的另一个存储过程可以使用它,但它在这里不起作用。我觉得很奇怪。呃,对不起,你能复制粘贴这个例子吗?因为我找到了正确的绑定,它们传递的是需要转换的时间戳值……好吧,这很有意义。我回头看了一个有效的例子,我传递的不是列名或表名。你是对的,它适用于除列或表名以外的所有其他名称。非常感谢。