---
schema_version: "1"
id: 1c9a145e9ddb8c26e2a3b1e97a75c93e67951976e7a911c30f3c2f0496552377
title: 存储过程
collection: tableau
version: next
locale: zh-cn
portal_url: https://docs.salesforce.com/tableau/next/zh-cn/public/desktop/connect_basic_stored_procedures.md
canonical_url: https://help.tableau.com/v0.0/public/desktop/zh-cn/connect_basic_stored_procedures.htm
source_site: help.tableau.com
content_type: documentation
content_hash: 4944556d3048228e422f13f50d9b553913b0d15512e48f7ae461b0f76c527842
description: Use a stored procedure to define a database connection in Tableau, with database-specific constraints.
---
[跳转到主要内容](#main-content)

# 使用存储过程

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

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

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

![数据窗格上找到的存储过程列表。](/tableau/next/zh-cn/public/desktop/zh-cn/Img/stored_procedures1.png)

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

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

![数据类型参数表。](/tableau/next/zh-cn/public/desktop/zh-cn/Img/stored_procedures3.png)

如果您随后在视图中公开 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 数据库错误。