---
schema_version: "1"
id: 32d46195d2fbadd3f2915d83530747c00cf65d85c6e67ff04065872f1e9a6b16
title: 預存程序
collection: tableau
version: next
locale: zh-tw
portal_url: https://docs.salesforce.com/tableau/next/zh-tw/public/desktop/connect_basic_stored_procedures.md
canonical_url: https://help.tableau.com/v0.0/public/desktop/zh-tw/connect_basic_stored_procedures.htm
source_site: help.tableau.com
content_type: documentation
content_hash: 944211fb791a5270cc7ece5f3c17e669d9e10feb09d64143be767cc12a53734d
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-tw/public/desktop/zh-tw/Img/stored_procedures1.png)

從左側窗格中，將該程序拖動到畫布或按兩下列出的一個過程。如果該程序中有可用參數，將自動顯示 \[參數\] 對話方塊。 

您可以使用現有 Tableau 參數而無需輸入值，或者為值建立新 Tableau 參數：

![資料類型參數表。](/tableau/next/zh-tw/public/desktop/zh-tw/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 資料庫錯誤。