SAP Hana DB SQL 中声明数组/表变量值时出现错误

2024-05-10

我试图添加一个声明的变量来替换“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有效地?


根据OP反馈进行更新。

要在 SQLScript 中引用变量(为了访问其值),它是 需要加上冒号:在变量名前面。

然而,主要问题是声明CODES_TABLE表变量。 对于 HANA 2 SPS 4,错误消息是

`SAP DBTech JDBC: [264]: invalid datatype: unknown type SYSTEM.TABLE: line 5 col 23`

这指向 TABLE 类型变量的声明CODES_TABLE它缺少表中应包含哪些列的定义。

添加这个可以解决这个问题。

通过这些更改,您的代码应该可以工作:

DO
BEGIN

  DECLARE CODES_ARRAY NVARCHAR(100) ARRAY = ARRAY('01','02','03','04');
  DECLARE CODES_TABLE TABLE ("code" NVARCHAR(100)) = 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);
  --                                     ^
  --                                     |
  ---------------------------------------+
END;

声明和分配表变量的另一种选择是不使用DECLARE命令。

DO
BEGIN

  DECLARE CODES_ARRAY NVARCHAR(100) ARRAY = ARRAY('01','02','03','04');

  CODES_TABLE = 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);

END;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SAP Hana DB SQL 中声明数组/表变量值时出现错误 的相关文章

随机推荐