---
schema_version: "1"
id: 7a3126d79dc658a3cfcbf917dc866eb1592f53e7c8f1ce54d7d7d01579710204
title: 运行初始 SQL
collection: tableau
version: next
locale: zh-cn
portal_url: https://docs.salesforce.com/tableau/next/zh-cn/server-linux/connect_basic_initialsql.md
canonical_url: https://help.tableau.com/v0.0/server-linux/zh-cn/connect_basic_initialsql.htm
source_site: help.tableau.com
content_type: documentation
content_hash: b2ab686e0e3bfb56aa650c47676267a43923fdd4524d4ff2566bc20989eee316
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 及更高版本支持使用初始 SQL，但尚不支持 Tableau Desktop 支持的所有相同选项。有关将初始 SQL 与 Tableau Prep Builder 结合使用的信息，请参见 Tableau Prep Builder Salesforce 帮助中的[使用初始 SQL 查询您的连接](https://help.tableau.com/current/prep/zh-cn/prep_connect.htm#initial_SQL)。

连接到某些数据库时，您可以指定连接到数据库（例如，打开工作簿、刷新数据提取、登录到 Tableau Server 或发布到 Tableau Server）时运行或使用缓存值的初始 SQL 命令。

**注意：**初始 SQL 与自定义 SQL 连接不同。自定义 SQL 连接定义针对其发出查询的关系（或表）。有关详细信息，请参见[连接到自定义 SQL 查询](https://help.tableau.com/current/pro/desktop/zh-cn/customsql.htm)。

可使用此命令：

- 设置将在会话期间使用的临时表。
- 设置自定义数据环境。

您可以在“服务器连接”对话框中或在“数据源”页上选择添加初始 SQL 命令。

注意：如果您的数据源支持运行初始 SQL 语句，则“服务器连接”对话框的左下角中会出现“初始 SQL”链接。有关数据源的信息，请参见[支持的连接器](https://help.tableau.com/current/pro/desktop/zh-cn/exampleconnections_overview.htm)。

## 使用初始 SQL

1. 在“服务器连接”对话框上，单击“初始 SQL”。或者，在“数据源”页面上，选择“数据”\>“初始 SQL”或“数据”\>“查询分段和初始 SQL”，具体取决于您要连接的数据库。
2. 在“初始 SQL”对话框中输入 SQL 命令。可使用“插入”下拉菜单将参数传递给数据源。
    
    ![初始 SQL 设置，其中有一个用于输入 SQL 语句的文本字段。](/tableau/next/zh-cn/server-linux/zh-cn/Img/connect_basic_initialsql.png)

**注意：**Tableau 不会检查语句有无错误。在连接时，此 SQL 语句会发送到数据库。

您的软件许可证可能会限制您针对连接使用初始 SQL。如果发布到 Tableau Server，则必须对该服务器进行配置以允许使用“初始 SQL”语句。默认情况下，已将服务器软件配置为在 Web 浏览器加载工作簿时允许运行这些语句。

管理员可通过使用 `tsm configuration set` 命令将服务器配置为忽略初始 SQL 语句：

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

如果服务器不允许使用初始 SQL 语句，则该工作簿仍会打开，但不会发送初始 SQL 命令。

有关 `tsm configuration set` 命令的详细信息，请参见 [Tableau Server 帮助](https://help.tableau.com/current/server/zh-cn/cli_configuration_tsm.htm#TSMSet)。

## 初始 SQL 语句中的参数

您可以将参数传递给初始 SQL 语句中的数据源。下面列出了在初始 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 文档以了解正确的语法。

### 针对服务器延迟执行

您可以延迟初始 SQL 语句，以便只在服务器上执行该语句。针对服务器延迟执行的一个原因是您没有权限执行设置模拟的命令。使用 <ServerOnly></ServerOnly> 标记将只在服务器上执行的命令括起来。

示例：

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

### 安全性和模拟

如果在初始 SQL 语句中使用 TableauServerUser 或 TableauServerUserFull 参数，则您将创建一个不能与其他用户共享的专用连接。这也可能限制缓存共享，从而可以增强安全性，但也可能会降低性能。

## MySQL 和 Oracle 连接的“创建表”疑难解答

#### 对于 MySQL 连接，在使用初始 SQL 创建表后，表未列出

连接到 MySQL 并运行初始 SQL 语句后，则表可能会由于 Tableau 构建查询的方式而无法显示：

CREATE TABLE TestV1.testtable77(testID int);

若要解决此问题，请向 SQL 语句中添加 `IF NOT EXISTS`：

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

#### 对于 Oracle 连接，使用初始 SQL 创建表会导致 Tableau 停止响应

当您连接到 Oracle 并运行初始 SQL 语句后，Tableau 会由于其构建的查询方式而停止响应，并显示不断旋转的滚轮。

CREATE TABLE TEST\_TABLE (TESTid int)

若要解决此问题，请使用以下 SQL 语句：

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