从 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.
我在 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.