使用存储过程
存储过程是可供访问关系数据库系统的应用程序使用的例程。使用 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 数据库错误。