从 Azure Function App 调用 Snowflake 过程
Posted
技术标签:
【中文标题】从 Azure Function App 调用 Snowflake 过程【英文标题】:Call Snowflake Procedure from Azure Function App 【发布时间】:2020-03-11 09:18:35 【问题描述】:我在 Snowflake 中有程序,想从我的计时器触发 Azure 函数应用程序中调用它。 该过程需要一个字符串类型的参数。以下是我连接到 Snowflake 并使用参数调用该过程的代码 sn-p。
using (IDbConnection conn = new SnowflakeDbConnection())
//Connect to Snowflake
conn.ConnectionString = Environment.GetEnvironmentVariable("SnowflakeConnection");
conn.Open();
using (IDbCommand cmd = conn.CreateCommand())
if (conn.State == ConnectionState.Open)
cmd.CommandText = "SP_Snowflake_Procedure";
//cmd.CommandType = CommandType.StoredProcedure;
var date = cmd.CreateParameter();
date.ParameterName = "RUNDATE";
date.DbType = DbType.String;
date.Value = "2018-01-01";
cmd.Parameters.Add(date);
using (IDataReader dr = cmd.ExecuteReader())
/****************
Logic to work on data
received from SP
*****************/
当控制到 cmd.ExecuteReader() 时,它失败并出现错误:Snowflake.Data: SQL 编译错误:位置 0 处的语法错误第 1 行意外'SP_Snowflake_Procedure'。
我不明白这个雪花,如何调用程序。我有一个想法,它类似于MS SQL。但我错了。我什至找不到合适的相关文件。 我可以在没有过程调用的情况下使用相同的代码,但可以使用简单的 SELECT 语句并且工作正常。 在这里建议我进行任何更改。
【问题讨论】:
【参考方案1】:我无法从代码中判断您是使用适用于 Snowflake 的 ODBC 驱动程序还是适用于 Snowflake 的 .NET 驱动程序。 ODBC 驱动比 .NET 驱动支持更多功能,但我认为两者都应该支持执行 SP。
您需要使用执行查询的 SQL 语句进行调用(与执行非查询的方法相反)。它将返回一个带有单行的表,其中包含来自 SP 的返回。它将包含单个列,其中包含 SP 的名称和 SP 的标量值(基本上,如果在 Web UI 中运行,将返回到 SQL 工作表)。
这里有一个示例 SP 供您测试,以防您需要一个简单的示例:
create or replace procedure EchoString(stringValue string)
returns VARCHAR
language javascript
as
$$
// Note that variables passed to Snowflake stored procedures
// muat be all CAPITAL letters when used in the body of the
// procedure code.
return STRINGVALUE
$$;
--Run the stored procedure to echo the value.
call EchoString('Echo this string.');
以下是使用 ODBC 连接从 C# 项目调用 SP 的方法:
OdbcConnection DbConnection = new OdbcConnection("DSN=Snowflake;pwd=******");
OdbcCommand DbCommandSetup = DbConnection.CreateCommand();
DbConnection.Open();
// These two lines are only required if you get a message about no running warehouse.
// It will depend on how your calling user is set up in Snowflake.
DbCommandSetup.CommandText = "use warehouse TEST;";
DbCommandSetup.ExecuteNonQuery();
OdbcCommand DbCommand = DbConnection.CreateCommand();
DbCommand.CommandText = "call TEST.PUBLIC.ECHOSTRING('Echo this string.')";
OdbcDataReader DbReader = DbCommand.ExecuteReader();
// Note: If you define a Snowflake SP, DB, or schema in mixed case without double quoting
// the name, Snowflake will uppercase it in the catalog. You can call it from here without
// converting to upper case as long as it's not double quoted (escaped \") in the string.
【讨论】:
我正在使用 .Net 驱动程序以上是关于从 Azure Function App 调用 Snowflake 过程的主要内容,如果未能解决你的问题,请参考以下文章
消费层上 Azure Function App 的白名单 IP
从 Azure Function App 访问带有防火墙的 Azure Blob 存储
Azure Function App 对 Webhook 的初始响应