存储过程是可供访问关系数据库系统的应用程序使用的例程。使用 Tableau 连接到 SAP Sybase ASE、Microsoft SQL Server 或 Teradata 数据库时,可以使用存储过程来定义连接。

对于 Oracle,您可以使用表函数来定义连接。Oracle 表函数的功能类似于存储过程,列在“数据源”页面上的“存储过程”下。

当您使用其中一种数据类型创建数据源时,存储过程下列出了可用的过程,如 Microsoft SQL Server 示例中所示:

从左侧窗格中,将该过程拖动到画布或双击列出的一个过程。如果该过程中有可用参数,将自动显示“参数”对话框。 

您可以使用现有 Tableau 参数而无需输入值,或者为值创建新 Tableau 参数:

如果您随后在视图中公开 Tableau 参数,用户将能够以交互方式更改过程中的参数值。

存储过程不支持联合、关联或联接。它们在逻辑层中的单个逻辑表中表示,并且不允许打开“联接/并集”画布(物理层)。

存储过程注意事项

如果您使用存储过程为 Tableau 定义数据源,请注意以下几点:

  • 如果存储过程返回多个结果集,Tableau 将读取第一个结果集并忽略其余结果集。

  • 如果存储过程具有输出参数,Tableau 会筛选该存储过程。

  • 不包括具有非标量类型的参数的存储过程。

  • 记录了 Tableau 中没有匹配类型的结果集列(例如 varbinary、geometry 和 hierarchyid)。如果所有结果集列都对应于未知数据类型,则 Tableau 会显示消息:

    “结果集...没有可用列。”

  • 没有返回结果集的存储过程将在数据源页中列出,但如果选择这些存储过程,则会失败。

  • 如果没有为存储过程所需的参数提供任何值,则会出现错误。Tableau 无法提前确定是否需要参数。

  • Tableau 不对存储过程执行任何事务管理。即,存储过程编写器不必依赖 Tableau 即可在调用存储过程之前启动事务,或者在调用存储过程之后提交事务。

  • 列名称必须唯一才可以使用存储过程。如果两个列的名称相同,或者未提供任何名称,则存储过程可能会导致错误。

  • 如果存储过程中有多个查询(例如,用于从另一表读取值或保存临时组合),则其中每个查询必须以相同顺序(相同名称和数据类型)返回同一组列。为确保列顺序和名称在查询结果中匹配,您可能需要执行显式 CAST 以确保数据类型正确(例如 CAST(Username as VARCHAR(20))),并显式命名这些列。如果存储过程不遵循这些指南,则可能出现错误消息:

    “InsertData: 未绑定的列错误”

  • 如果存储过程中有多个查询(例如,用于从另一表读取值或保存临时组合)并且该过程将产生错误,请尝试在该过程顶部添加 SET NOCOUNT ON。这可防止显示受 Transact-SQL 语句影响的行计数的消息作为查询结果集的一部分返回。

此外,以下约束适用于特定数据库。

Teradata 数据库的存储过程约束

以下约束适用于 Teradata 数据库中的存储过程。

  • 必须为每个参数提供值。如果用户没有为一个或多个参数提供值,则 Tableau 会显示一条 Teradata 数据库错误,指出为存储过程提供的值太少。

SQL Server 数据库的存储过程约束

以下约束适用于 SQL Server 数据库中的存储过程。

  • 如果存储过程的结果集包含 IMAGE 或 TEXT 类型的列,则存储过程会失败,并出现“语法不正确”错误消息。

  • 如果结果集的总宽度(每行中的字节数)超过 8060,则存储过程将失败。非常宽的表(几百列)或具有大型文本列的表(旨在容纳数千个文本字符)可能会出现这种情况。

  • Tableau 不会显示架构“sys”中的存储过程。

  • 如果用户没有为此过程需要的一个或多个参数提供值,则 Tableau 会以“此过程需要参数 @x 的值,但是没有提供”的形式显示一条 SQL Server 数据库错误。

  • 包含多个查询的存储过程应遵循“存储过程注意事项”(上文)中列出的指南。

  • Tableau Desktop 不支持 Microsoft SQL Server TIME 数据类型。当在 Microsoft SQL Server 数据库上的存储过程中包含此类型的字段时,Tableau Desktop 不会导入这些字段。

SAP Sybase ASE 数据库的存储过程约束

以下约束适用于 SAP Sybase ASE 数据库中的存储过程(仅限于 Windows)。

  • 数据库必须具有一个正确配置的远程服务器。

  • 如果用户没有为此过程需要的一个或多个参数提供值,则 Tableau 会以“此过程需要参数 @x 的值,但是没有提供”的形式显示一条 Sybase ASE 数据库错误。

感谢您的反馈!