我试图添加一个声明的变量来替换“where in”子句中的硬编码值列表。
研究 Hana 如何处理数组变量,似乎我可以通过声明一个数组,然后直接在其上使用选择或首先将其取消嵌套到表中来做到这一点,但我不断收到无法解决的错误。
当我这样尝试时:
DO
BEGIN
DECLARE CODES_ARRAY NVARCHAR(100) ARRAY = ARRAY('01','02','03','04');
SELECT T0."ItemCode"
FROM OITM T0
INNER JOIN OITW T1 ON T0."ItemCode" = T1."ItemCode"
WHERE "WhsCode" IN (SELECT "code" FROM :CODES_ARRAY); -- line 9 where error occurs
END;
我收到此错误消息sql syntax error: incorrect syntax near ")": line 9 col 54 (at pos 239)
我无法弄清楚语法错误解决方案是什么。
然后我尝试插入一个声明的表变量,如下所示:
DO
BEGIN
DECLARE CODES_ARRAY NVARCHAR(100) ARRAY = ARRAY('01','02','03','04');
DECLARE CODES_TABLE TABLE = UNNEST(:CODES_ARRAY) AS ("code"); -- line 5 where error occurs
SELECT T0."ItemCode"
FROM OITM T0
INNER JOIN OITW T1 ON T0."ItemCode" = T1."ItemCode"
WHERE "WhsCode" IN (SELECT "code" FROM CODES_TABLE); -- I know : is missing here but when adding, the same error from previous block shows up
END;
我收到此错误消息:identifier must be declared: 1: line 5 col 38 (at pos 123)
据我所知,数组变量已按其应有的方式声明,因此我不知道如何解决该错误。
我已经一遍又一遍地阅读 SAP Hana SQL 参考文档(针对数组/表变量、取消嵌套函数等),似乎我已经正确设置了所有内容,但无法找出这些错误。如果可能的话,我希望能够在不同的时间使用这两种方法(“数组变量到表变量”和“仅数组变量”方法)
我不知道到底发生了什么,但我注意到我的帖子中引用的两个不同的错误消息(参见前两个代码块中的错误的区别)是每个错误都在使用之前立即发生变量的:
(在 UNNEST 的情况下)或紧跟在变量后面:
(在使用的情况下SELECT * FROM
在查询中)。
因此,我想知道问题是否出在“上游”Hana ADO.NET
应用程序查询准备和执行调用级别,但我运行了一个测试,当我在执行之前仔细检查查询字符串时,它看起来没有变化,并且变量带有:
仍然看起来像他们应该的那样,所以至少在执行之前Hana ADO.NET
HanaCommand
它看起来是正确的 - 但是一旦使用执行查询HanaDataReader
or HanaDataAdapter
它返回上面提到的错误消息。从问题本身出发去追寻问题可能会转移注意力Hana ADO.NET
水平,但不知道还能做什么。
Update
为了进一步排除故障,我尝试使用以下命令执行以下代码块hdbsql.exe -n XXX.XXX.XXX.XXX:30015 -u XXX -p XXX -m -I "c:\temp\test.sql" -c "#"
它有效!因此,我看到的错误仅在通过执行相同的查询时才会出现Hana ADO.NET
界面。
DO
BEGIN
DECLARE CODES_ARRAY NVARCHAR(10) ARRAY = ARRAY('01','02','03','04');
DECLARE CODES_TABLE TABLE ("code" NVARCHAR(10)) = UNNEST(:CODES_ARRAY) AS ("code");
SELECT T0."ItemCode"
FROM OITM T0
INNER JOIN OITW T1 ON T0."ItemCode" = T1."ItemCode"
WHERE "WhsCode" IN (SELECT "code" FROM :CODES_TABLE); -- line 10 where error occurs when using Hana ADO.NET
END;
#
通过时上述失败Hana ADO.NET
出现错误消息:sql syntax error: incorrect syntax near ")": line 10 col 54 (at pos 325)
但通过执行时有效hdbsql
.
Update
执行查询的 C# 代码相当简单,但为了故障排除工作的完整性,我包含了我们的有趣部分HanaHelper
班级。此代码可以成功地每天执行 100 个查询,没有错误或问题。这是第一次尝试通过此代码在查询中声明或使用任何类型的变量,并且开始出现错误。据我所知,这个问题与使用:
在查询中使用变量时。
public class HanaHelper
{
public HanaConnection objConn = null;
public HanaHelper(string ConnectionString)
{
try
{
objConn = new HanaConnection(ConnectionString);
}
catch (Exception e)
{
Console.WriteLine(@"Exception thrown by HanaConnection: {0}\n{1}", e.Message, e.InnerException);
}
}
public DataSet GetData(string strSQL)
{
using (HanaCommand objCmd = new HanaCommand(strSQL, objConn))
{
using (HanaDataAdapter objDA = new HanaDataAdapter(objCmd))
{
DataSet objDS = new DataSet();
try
{
objDA.Fill(objDS);
}
catch (Exception)
{
throw;
}
finally
{
// do something interesting regardless of success or failure
}
objConn.Close();
return objDS;
}
}
}
}
这里有任何线索为什么相同的查询可以通过hdbsql
但执行时失败Hana ADO.NET
?
Update
我想出了如何使用HanaSQLTrace
在 C# 代码中,以便我可以检查准备好的查询文本和中提琴,错误消息的来源变得显而易见,所有出现的":VARNAME"
被替换为"? "
(a ?
取代了:
以及变量名称中每个字符的空格)。我想它正在尝试预先替换发生的情况:
with a ?
就好像有参数需要替换一样。
如何禁用、使用或解决此行为,以便我可以在查询中使用变量Hana ADO.NET
有效地?