我注意到"HANA“在占位符子句上下文中转义单引号的方式不一致。例如,考虑以下占位符子句片段:
('PLACEHOLDER' = ('$$CC_PARAM$$','''foo'',''an escaped single quote \'' '''))
上面的占位符子句包含分配给CC_PARAM的多个值。参数。我们可以看到,在第二个参数中,我们有一个用反斜杠转义的单引号。但是,我们用另一个单引号(即我们使用''而不是\'' )来规避每个参数之外的单引号。对于第一种情况,可以使用\''格式,但在第二种情况下,不可能使用''格式。
为什么会有这种差异?它使转义引号在多输入输入参数中很棘手。我希望以编程的方式为HANA编写SQL查询。我是不是漏掉了什么?在所有情况下,在\''之上使用''是否安全?还是我需要逻辑来判断单引号在哪里发生,并在适当的情况下转义?
发布于 2018-12-18 05:08:45
这里的隐含规则是,对于计算视图的参数值,反斜杠\用于转义单引号。
对于所有出现的标准SQL字符串,使用两次单引号''是区分语法元素和字符串文字的正确方法。
至于原因:
PLACEHOLDER语法不是SQL,而是特定于HANA的命令扩展。因此,不存在当前实现违反的通用标准。但是,参数不仅由SQL解析器解析一次,而且由基于计算视图实例化计算场景的组件再次解析。稍微斜视一下,不难看出参数接口是一个通用的键值接口,它允许将各种信息传递给calc。引擎。
人们可能会认为,通过键值对提供参数的整个方法不符合一般的SQL语法方法,而且是正确的。另一方面,这种方法允许向HANA特定部分添加新的命令元素,而不需要从结构上改变语法(以及与其一起使用解析器)。这明显的缺点是,键名和值都是字符串类型的。为了避免丢失“内部字符串”所需的转义,需要使用与主SQL转义字符串不同的转义字符串。
在这里,我们使用了两种不同的方法来传递字符串值,作为筛选条件。
有趣的是,这两种方法仍然可能导致相同的查询执行计划。
事实上,在许多具有输入参数的场景中,字符串值将在内部转换为符合SQL的表单。当输入参数用于筛选或在calc中的表达式中使用时,情况就是如此。可以转换为SQL表达式的视图。
例如
SELECT
"AAA"
FROM "_SYS_BIC"."sp/ESC"
('PLACEHOLDER' = ('$$IP_TEST$$', 'this is a test\''s test'));在我的系统上显示以下执行计划
OPERATOR_NAME OPERATOR_DETAILS
PROJECT TEST.AAA
COLUMN TABLE FILTER CONDITION: TEST.AAA = 'this is a test's test'
(DETAIL: ([SCAN] TEST.AAA = 'this is a test's test')) 注意转义-\'是如何被删除的。
总而言之:当使用PLACEHOLDER值时,需要使用\'转义,在所有其他情况下,需要使用''转义。对于查询生成器来说,这不应该是非常困难的实现,因为在处理PLACEHOLDER语法时可以考虑这一点。
https://stackoverflow.com/questions/53826008
复制相似问题