---
schema_version: "1"
id: cd3736177363b5e0bc81c25f71233adf8c7f19b37b078b47ea539d3657283ebc
title: 執行初始 SQL
collection: tableau
version: next
locale: zh-tw
portal_url: https://docs.salesforce.com/tableau/next/zh-tw/pro/desktop/connect_basic_initialsql.md
canonical_url: https://help.tableau.com/v0.0/pro/desktop/zh-tw/connect_basic_initialsql.htm
source_site: help.tableau.com
content_type: documentation
content_hash: e8c69edc714062031b1f80e2584083b4cde4dbf77e915e694bb39e0f96544508
description: Run an initial SQL command when connecting to a database, including parameters and deferred execution.
---
[跳至主要內容](#main-content)

# 執行初始 SQL

**附註**：Tableau Prep Builder 版本 2019.2.2 及更高版本支援使用 Initial SQL，但尚不支援 Tableau Desktop 支援的所有相同選項。有關在 Tableau Prep Builder 中使用 Initial SQL 的資訊，請參閱 Tableau Prep Builder Salesforce 說明中的[使用 Initial SQL 查詢連線](https://help.tableau.com/current/prep/zh-tw/prep_connect.htm#initial_SQL)。

連線到某些資料庫後，可以指定 Initial SQL 命令，該命令將在與資料庫建立連線（例如，開啟工作簿、重新整理擷取、登入 Tableau Server 或發佈到 Tableau Server）時執行或使用快取的值。

**附註：**Initial SQL 與自訂 SQL 連線不同。自訂 SQL 連線定義針對其發出查詢的關係（或表）。有關詳情，請參閱[連線到自訂 SQL 查詢](https://help.tableau.com/current/pro/desktop/zh-tw/customsql.htm)。

可使用此命令：

- 設定將在會話期間使用的臨時表。
- 設定自訂資料環境。

您可以在「伺服器連線」對話方塊中或在「資料來源」頁上選擇新增初始 SQL 命令。

附註：如果您的資料來源支援執行初始 SQL 語句，則「伺服器連線」對話方塊的左下角中會出現「初始 SQL」連結。有關資料來源的資訊，請參閱[支援的連接器](https://help.tableau.com/current/pro/desktop/zh-tw/exampleconnections_overview.htm)。

## 使用初始 SQL

1. 在「伺服器連線」對話方塊上，按一下「初始 SQL」。或者，在「資料來源」頁面上，選取「資料」\>「初始 SQL」或「資料」\>「查詢分段和初始 SQL」，具體取決於您要連線的資料庫。
2. 在「初始 SQL」對話方塊中輸入 SQL 命令。可使用「插入」下拉式功能表將參數傳遞給資料來源。
    
    ![初始 SQL 設定，其中包含輸入 SQL 陳述式的文字欄位。](/tableau/next/zh-tw/pro/desktop/zh-tw/Img/connect_basic_initialsql.png)

**附註：**Tableau 不會檢查陳述式是否有錯誤。連線後，會將此 SQL 陳述式傳送到資料庫。

您的軟體許可證可能會限制您針對連線使用初始 SQL。如果發佈到 Tableau Server，則必須對該伺服器進行設定以允許使用「初始 SQL」語句。預設情況下，已將伺服器軟體設定為在 Web 瀏覽器載入工作簿時允許運行這些語句。

管理員可以使用 `tsm configuration set` 命令將伺服器設定為忽略 Initial SQL 陳述式：

`tsm configuration set -k vizqlserver.initialsql.disabled -v true`

若伺服器不允許使用 Initial SQL 陳述式，則工作簿會開啟，但不會傳送 Initial SQL 命令。

有關 `tsm configuration set` 指令更多的詳情，請參閱 [Tableau Server 說明](https://help.tableau.com/current/server/zh-tw/cli_configuration_tsm.htm#TSMSet)

## 初始 SQL 語句中的參數

您可以將參數傳遞給初始 SQL 語句中的資料來源。以下清單列出了在 Initial SQL 陳述式中使用參數的幾個好處。

- 您可以使用 TableauServerUser 或 TableauServerUserFull 參數設定類比。
- 若資料來源支援，可以設定列層級安全性（例如，Oracle VPD 或 SAP Sybase ASE），以確保使用者只能看到他們獲授權查看的資料。
- 您可以在日誌記錄中提供更多詳細，例如，Tableau 版本或工作簿名稱。

初始 SQL 語句中支援以下參數：

<table class="table--plain"><tbody><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyE-Column1-Body1"><span class="uicontrol">參數</span></td><td class="TableStyle-Basic-Border-BodyE-Column1-Body1"><span class="uicontrol">描述</span></td><td class="TableStyle-Basic-Border-BodyD-Column1-Body1"><span class="uicontrol">返回值的範例</span></td></tr><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyE-Column1-Body1"><span class="uicontrol">TableauServerUser</span></td><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">當前伺服器使用者的使用者名稱。在伺服器上設定模擬時使用。若使用者未登入 Tableau Server，則傳回空字串。</td><td class="TableStyle-Basic-Border-BodyD-Column1-Body1">jsmith</td></tr><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyE-Column1-Body1"><span class="uicontrol">TableauServerUserFull</span></td><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">當前伺服器使用者的使用者名稱與網域。在伺服器上設定模擬時使用。若使用者未登入 Tableau Server，則傳回空字串。</td><td class="TableStyle-Basic-Border-BodyD-Column1-Body1">domain.lan\jsmith</td></tr><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyE-Column1-Body1"><span class="uicontrol">TableauApp</span></td><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">Tableau 應用程式的名稱。</td><td class="TableStyle-Basic-Border-BodyD-Column1-Body1"><p><span class="mc-variable Variables.TabsProductDesktop variable">Tableau Desktop</span> Professional</p><p>Tableau Server</p></td></tr><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyE-Column1-Body1"><span class="uicontrol">TableauVersion</span></td><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">Tableau 應用程式的版本。</td><td class="TableStyle-Basic-Border-BodyD-Column1-Body1">9.3</td></tr><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyB-Column1-Body1"><span class="uicontrol">WorkbookName</span></td><td class="TableStyle-Basic-Border-BodyB-Column1-Body1">Tableau 工作簿的名稱。僅用於具有嵌入式資料來源的工作簿。</td><td class="TableStyle-Basic-Border-BodyA-Column1-Body1">Financial-Analysis</td></tr></tbody></table>

> [!WARNING]
> 
> **警告：**Tableau Desktop 不包含網域。若不使用委派，並設定 tsm configuration set -k DelegationUseFullDomainName=-v true--force-keys，則可以包括。

以下範例顯示可以在初始 SQL 語句中使用參數的不同方式。

- 本範例在 Microsoft SQL Server 上設定安全上下文：
    
    `EXECUTE AS USER = [TableauServerUser] WITH NO REVERT;`
- 本範例演示如何在 DataStax 資料來源中使用參數在記錄中新增詳細資料，或設定工作階段變數追蹤該資料：
    
    `SET TABLEAUVERSION [TableauVersion];`
- 本範例可用於幫助設定 Oracle VPD 的列級別安全性：
    
    `begin`
    
     `DBMS_SESSION.SET_IDENTIFIER([TableauServerUser]);`
    
    `end;`
    
    附註：Oracle PL/SQL 區塊需要後置分號來終止該區塊。請查閱 Oracle 文件以瞭解正確的語法。

### 針對伺服器延遲執行

可以延遲 Initial SQL 陳述式，使其僅在伺服器上執行。針對伺服器延遲執行的一個原因是您沒有權限執行設定模擬的命令。使用 <ServerOnly></ServerOnly> 標記將只在伺服器上執行的命令括起來。

範例：

CREATE TEMP TABLE TempTable(x varchar(25));
INSERT INTO TempTable VALUES (1);
<ServerOnly>INSERT INTO TempTable Values(2);</ServerOnly>

### 安全性和模擬

在 Initial SQL 陳述式中使用 TableauServerUser 或 TableauServerUserFull 參數可建立一個無法與其他使用者共用的專用連線。這還可以限制快取共用，從而增強安全性，但也會降低效能。

## 對 MySQL 和 Oracle 連線的「建立表格」進行疑難排解

#### 如果是 MySQL 連線，使用 Initial SQL 建立資料表後未列出資料表

連線到 MySQL 並執行 Initial SQL 陳述式後，可能會因為 Tableau 建構查詢的方式而未顯示資料表。

CREATE TABLE TestV1.testtable77(testID int);

若要解決此問題，請將 `IF NOT EXISTS` 新增至 SQL 陳述式：

CREATE TABLE IF NOT EXISTS TestV1.TestTable(testID int);

#### 如果是 Oracle 連線，使用 Initial SQL 建立資料表會導致 Tableau 停滯

連線到 Oracle 並執行 Initial SQL 陳述式後，Tableau 會由於 Tableau 建構查詢的方式而陷入停滯。

CREATE TABLE TEST\_TABLE (TESTid int)

若要解決此問題，請使用下列 SQL 陳述式：

BEGIN
EXECUTE IMMEDIATE 'create table test\_table(testID int)';
EXCEPTION
WHEN OTHERS THEN NULL;
END;