当前位置:主页 > 云存储 > 数据库 >

站群服务器_高性能_云计算的优势是什么

  • 数据库
  • 2021-04-09 06:10
  • 动埠云

在上一篇文章中,我演示了如何在saphanaxsclassic中创建表函数(TF)。TF的缺点之一,我提到了一个事实,即它们不支持多值输入参数,这是官方的:

我个人认为这是一个很大的限制,因为当一些功能不能被图形视图覆盖时,然后建议使用SQL表函数——所以为什么我们不能在那个里传递多值参数呢?在报表世界中,这是最基本的功能之一,可以让用户灵活地定义输入标准,不是吗?

在某些情况下,这种限制迫使我在图形视图中实现复杂的逻辑,尽管在SQL中可以做得容易得多。但是我不能剥夺最终用户选择多个值的可能性。

对于小数据集,当没有以图形方式实现报表逻辑的选项时,我创建表函数(没有输入参数),然后在图形视图中,企业管理平台软件,使用TF I创建变量。但在这种方法中,用户在变量中提供的值并没有直接下推到表中,所以这种解决方案的性能很差。

最后我得到了一个要求,大量数据,这迫使我找到一种方法,将多值参数直接传递到SQL查询–这是为了创建BOM(BOM表)报表,用户希望在该报表中显示输入材料的所有组件。现在想象一下,为所有现有的材料运行这样一个报告,并从各个层次递归地搜索它的所有组件——即使对HANA来说也是不可能的——这是我开始深入寻找通过计算视图输入参数将多个值传递到表函数的解决方案的时刻。

在这个博客中,我将分享我的发现以及我发现的解决方法。

开发人员的常见错误是试图在谓词中应用结合多值输入参数和SQL的过滤器,但这是行不通的:

为了将问题可视化,让我们创建一个简单的表函数,它只返回插入参数的值:

然后创建计算视图,它将消耗TF(1)。激活前,记得将输入参数映射到TF和计算视图(2)之间,并将输入参数设置为多个条目:

激活后,将多个值传递到选择屏幕并检查输出:

乍一看结果可能是正确的,因为这些是我们想要传递给IN谓词的值,但实际上它是错误的。这里不是传递3个单独的值,而是传递一个字符串,将所有3个值串联起来。背景中的语法是这样的:

WHERE COLUMN in:MULTI\u VALUE\u IP=>WHERE COLUMN in'AA,BB,CC'

所以没有过滤三个单独的值,而是在一个串联的值上有一个过滤器(为了更清楚,我在这里跳过了单引号,因为传递的实际值是:'"AA","BB","CC"

下面我展示了HANA如何转换多个插入的值(在左边)以及我们需要什么值才能使它工作(在右边):

有两种方法来实现多值参数处理。

为了演示的目的,大数据产业,我创建了数据库表TEST\u ORDERS并在那里插入了一些示例记录。该表的结构如下:

我将把它作为数据源进一步演示

1.使用APPLY\u FILTER()语句

APPLY\u FILTER是SQL函数,全国大数据中心,它允许在表上创建动态过滤器。该函数的语法如下:

为了给大家更多的例子,我准备了三种不同的场景。

要求创建订单报表,客户编号列必须输入多值参数。

这里是表函数的定义:

I.定义输入参数。将varchar数据类型赋给输入参数(即使筛选的列是整数类型)。考虑到HANA将多个插入的值连接到单个字符串中,所以为了允许用户输入尽可能多的值,我定义了最大字符数5000。我将在最后一节详细描述这个限制。创建变量并指定动态过滤器定义。筛选器定义语法应与在SQLWHERE子句之后使用的语法相同。将过滤器定义与输入参数相结合(| |符号用于连接字符串)

III.将SELECT查询赋给变量。此表变量将由APPLY\u FILTER函数使用。

四、使用APPLY\u FILTER函数。作为第一个函数参数,提供带有SELECT查询的表变量(此处:ORDERS),作为第二个参数,提供带有动态过滤器定义的变量(此处:filter)。将APPLY\U FILTER的输出分配给另一个表变量(这里是FILTED\U ORDERS)

V.使用APPLY\U FILTER函数的输出查询表变量。

一旦激活表函数,创建一个图形计算视图。作为一个源,提供创建的表函数和映射输入参数:

选择选项多个条目,并且对于该输入参数是必需的:

现在让我们运行数据预览,在选择屏幕上选择多个值并查看输出:

所以我们刚刚通过计算视图将多个值传递给表函数!

要求为客户编号列创建带有可选多值输入参数的订单报表。

为支持可选多值参数,需要调整部分代码(仅第二部分,其他一切保持在场景1)中:

II.创建一个变量并分配动态过滤器定义。这里执行了额外的检查。如果inserted参数的值为空,则将赋值给过滤器变量string 1=1,否则使用与第一个场景中相同的条件。当您传递以将\u FILTER函数值1=1作为筛选器变量应用时,将返回所有记录(因为此条件始终有效)。当用户没有为输入参数提供任何值时,这是一个显示所有记录的解决方法。

现在当您没有为输入参数提供任何值时,您将获得输出中的所有记录:

对于其他插入值,视图将与场景1一样。

要求创建具有两个强制值和多个值的订单报告输入参数一个用于客户编号,第二个用于类别栏。

在这种情况下,与场景1相比,两部分代码需要进行小的调整。

I.为类别添加新的输入参数。

II。调整分配给FILTER变量的字符串以包含CATEGORY作为过滤器。

在计算视图中,您需要添加新的输入参数,怎么做淘客,并将其映射到在表函数(IP\U CATEGORY)中创建的参数:

现在您可以为这两个参数输入多个值,过滤器将同时考虑这两个参数:

2.创建自定义函数拆分将字符串转换为多个值

第二种实现将多个值传递到表函数的方法是创建自定义SQL函数。该函数中的逻辑将把连接的字符串拆分为多个记录。下面是自定义函数的代码:

现在我们可以在SQL查询中使用该函数。为了演示的目的,让我们使用场景1.

要求创建订单报告,客户编号列具有强制和多值输入参数。

创建图形计算视图,使用表函数作为源并映射输入参数:

现在让我们运行数据预览,在选择屏幕上选择多个值并查看输出:

结果与带APPLY\ U滤波功能的方法相同。从性能的角度来看,APPLY\ U FILTER的工作速度会更快,但差异会很小。

虽然给出的解决方案允许通过计算视图将多个值传递给表函数,这两种方法的实现都有一个主要的限制。

  • 关注微信

猜你喜欢

微信公众号