从 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 的初始响应

有没有办法从多个 .NET 项目创建一个 Azure Function App 并拥有所有这些项目的所有功能?

发布后似乎没有触发 Azure Function App

HttpClient HTTP/2 从 Azure Function 调用 APN