从 Azure Function App 调用 Snowflake 过程

Call Snowflake Procedure from Azure Function App

我在 Snowflake 中有程序,想从我的 Timer Triggered Azure Function App 调用它。
该过程需要一个字符串类型的参数。以下是我连接到 Snowflake 并使用参数调用该过程的代码片段。

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'.

我不明白这个雪花,如何调用一个过程。我有一个想法,它与MSSQL的方式相似。但我错了。我什至找不到合适的相关文件。
我可以在没有过程调用的情况下使用相同的代码,但简单的 SELECT 语句并且工作正常。
在这里建议我任何更改。

我无法从代码中判断您使用的是用于 Snowflake 的 ODBC 驱动程序还是用于 Snowflake 的 .NET 驱动程序。 ODBC驱动比.NET驱动支持更多的功能,但我认为两者都应该支持执行SP。

您需要使用执行查询的 SQL 语句进行调用(与执行非查询的方法相反)。它将 return 一个 table 与来自 SP 的 return 单行。它将包含一个列,其中包含 SP 的名称和 SP 的标量值(基本上是 returned 到 SQL 工作表,如果 运行 在网络 UI).

这里有一个示例 SP 供您测试,以防您需要一个简单的 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.