Snowflake结合.NET连接器查询JSON时,是否支持为属性名绑定参数?
问题解答
Snowflake及其.NET连接器不支持直接将绑定参数用作JSON属性路径的标识符,你之前的两种写法都不符合Snowflake参数绑定规则,导致报错:
- 第一种写法
ROW_DATA::myParameter::string中,::myParameter会被Snowflake误认为是自定义数据类型,因此抛出“Unsupported data type 'MYPARAMETER'”错误。 - 第二种写法
ROW_DATA:(?)::string的语法本身不合法,Snowflake的JSON路径语法不允许直接在:后使用问号参数占位符。
正确解决方案:使用GET_PATH函数
Snowflake提供的GET_PATH函数可以接受字符串参数作为JSON属性路径,完美适配你的场景,无需修改SQL语法结构即可安全传递参数。
修正后的SQL语句:
SELECT GET_PATH(ROW_DATA, :myParameter)::string FROM TableName
修正后的C#代码:
string columnSql = "SELECT GET_PATH(ROW_DATA, :myParameter)::string FROM TableName"; DbCommand colValCommand = conn.CreateCommand(); colValCommand.CommandText = columnSql; DbParameter myParameter = colValCommand.CreateParameter(); myParameter.DbType = DbType.String; myParameter.Value = "Test Column 1"; // 直接传入带空格的属性名 myParameter.ParameterName = "myParameter"; colValCommand.Parameters.Add(myParameter); using (DbDataReader reader = await colValCommand.ExecuteReaderAsync()) { // 处理查询结果逻辑 if (reader.Read()) { string value = reader.GetString(0); // 使用获取到的JSON属性值 } }
备选方案:动态SQL(需注意SQL注入)
如果一定要使用ROW_DATA:<属性名>的语法,可通过动态SQL实现,但必须用IDENTIFIER函数转义参数,避免SQL注入风险:
SQL与代码示例:
string columnSql = "EXECUTE IMMEDIATE 'SELECT ROW_DATA:IDENTIFIER(?)::string FROM TableName' USING :myParameter"; DbCommand colValCommand = conn.CreateCommand(); colValCommand.CommandText = columnSql; DbParameter myParameter = colValCommand.CreateParameter(); myParameter.DbType = DbType.String; myParameter.Value = "Test Column 1"; myParameter.ParameterName = "myParameter"; colValCommand.Parameters.Add(myParameter); using (DbDataReader reader = await colValCommand.ExecuteReaderAsync()) { // 处理结果 }
注意:动态SQL写法相对繁琐,且需严格确保参数安全,优先推荐使用
GET_PATH方案。
内容的提问来源于stack exchange,提问作者Timothy G.
相关产品推荐
相关产品推荐

