Ascmd 命令行实用工具示例自述文件

更新日期: 2006 年 12 月 12 日

ascmd 命令行实用工具让数据库管理员可以对 Microsoft SQL Server 2005 Analysis Services (SSAS) 实例执行 XMLA 脚本、MDX 查询或 DMX 语句。此命令行实用工具包含 Analysis Services 的功能,类似于 SQL Server 2005 附带的 sqlcmd 实用工具。有关详细信息,请参阅 SQL Server 2005 中的 sqlcmd 实用工具主题。脚本、查询或语句的执行结果可以与相关 SQL Server Profiler跟踪信息一起存储在某个文件中。ascmd 命令行实用工具的默认安装位置如下:

<system_drive>\Program Files\Microsoft SQL Server\90\Samples\Analysis Services\Administrator\ascmd

方案

以下方案提供了使用 ascmd 命令行实用工具的示例。

通过第三方工具处理分区

作为夜间提取、转换和加载 (ETL) 进程的一部分,数据库管理员必须处理分区和维度。ETL 工具并非 SQL Server 工具,并且数据库管理员不能使用 SQL Server 代理的 XMLA 脚本内置支持或运行 SQL Server 2005 Integration Services (SSIS) 包。数据库管理员需要一个使用第三方工具的自动解决方案。此解决方案是一个运行 XMLA 脚本的命令行实用工具。然后,从第三方工具调用该实用工具。数据库管理员下载并编译 ascmd 命令行实用工具示例。编译完后,数据库管理员就可以使用 ascmd 命令行实用工具来执行用于处理分区和维度的 XMLA 脚本。

通过第三方工具备份 OLAP 数据库

同一公司的另一位数据库管理员需要自动备份 Analysis Services 数据库。同样,因为该公司使用的计划软件不是 SQL Server 工具,所以必须从命令行运行此任务。数据库管理员生成相应的 XMLA 脚本(使用 SQL Server Management Studio)。然后,第三方计划软件使用 ascmd 命令行实用工具运行 XMLA 脚本来备份 OLAP 数据库。

在安装期间使用 XMLA

独立软件供应商的开发人员需要将 XMLA 脚本的执行直接集成到公司产品的安装中。开发人员必须运行 XMLA 脚本并检索状态(和跟踪事件),才能知道 Analysis Services 数据库是否创建正确。开发人员可使用 ascmd 命令行实用工具完成此操作。

语言

  • C# 是 ascmd 自身的编码语言。
  • 批处理文件命令,用于启动 ascmd 命令行实用工具。

必备组件

若要有效地使用 ascmd 命令行实用工具,应安装以下部分或全部软件:

  • Microsoft SQL Server 2005 Analysis Services (SSAS)
    必须安装和运行 Analysis Services 实例,因为 ascmd 命令行实用工具 用于连接到 Analysis Services 实例并执行 MDX 查询、XMLA 脚本和 DMX 语句。
  • SQL Server Management Studio 与 Business Intelligence Development Studio
    这两个工作环境提供支持基础结构,使您可以完成任何与 Analysis Services 相关的任务。对于任何给定的任务,都可以通过用户界面或以编程方式实现。
  • Microsoft Visual Studio 2005 或 .NET Framework SDK 2.0
    建议您在生成或自定义 ascmd 示例应用程序时使用 Visual Studio 2005。如果没有 Visual Studio 2005,则使用 .NET Framework SDK 2.0。.NET Framework SDK 包括 MSBuild.exe(请参阅本文档后面的“编译示例”安装)。

参数

ascmd 命令行支持以下参数。

  • –Ulogin_id
    用户登录 ID,区分大小写。

    ms365187.note(zh-cn,SQL.90).gif注意:
    login_id 针对 sqlcmdascmd 的用法不同。在 sqlcmd 中,login_id 表示 SQL Server 登录名;对于 ascmd,它表示 Windows 登录名。

    对于 TCP/IP 访问,Analysis Services 只支持可信连接。如果指定了 –U 参数(并使用 –P 参数指定了匹配密码),则 ascmd 命令行实用工具使用指定帐户登录 Windows 操作系统,并在执行 XMLA 脚本、MDX 查询或 DMX 语句时模拟该帐户。登录 ID 的形式必须为 <域>\<用户名>,且必须指定域。如果未指定 –U,则身份验证基于运行 ascmd 命令行实用工具的用户的 Windows 帐户。

    如果通过 –S 参数指定 http(或 https)连接,则 ascmd 命令行实用工具不会登录 Windows 操作系统。而是将 –U–P 参数(如果存在)作为到 Internet 信息服务 (IIS) 服务器的连接字符串的一部分。根据 IIS 的配置,–U–P 参数可用于基本身份验证。有关“UID”连接字符串参数的详细信息,请参阅 SQL Server 2005 联机丛书中的 AdomdConnection 类。

  • –Ppassword
    –U 参数相关的用户指定的匹配密码。如果指定了 –U 参数,但未指定 –P 参数,则假定密码为空(长度为零的空字符串)。如果指定了 –P 参数,但未指定 –U 参数,则忽略 –P 参数。

    ms365187.security(zh-cn,SQL.90).gif安全说明:
    不要使用空密码。请使用强密码。有关详细信息,请参阅 SQL Server 2005 联机丛书中的强密码–P 参数密码在脚本、查询或语句文件中存储为明文。可以看到计算机监视器或读取文件本身的任何人都可以看到它。如果使用此功能,请在文件上设置 ACL 或使用其他安全技术来确保只有可信用户才能读取这些文件。
  • –Sserver\instance–Shttp[s]://server[:port]/virtualdirectory/msmdpump.dll
    指定 ascmd 命令行实用工具要连接和执行的 Analysis Services 实例。如果未指定 –P 参数,则 ascmd 命令行实用工具连接到运行 TCP 的本地计算机上的 Analysis Services 默认实例(连接到本地主机),并执行 XMLA 脚本、MDX 查询或 DMX 语句。
  • –ddatabase
    指定要对其执行 MDX 查询或 DMX 语句的数据库。ascmd 命令行实用工具执行 XMLA 脚本时,将忽略 –d 参数,因为 XMLA 脚本具有嵌入的数据库名称。
  • –tquery-timeout
    指定 XMLA 脚本、MDX 查询或 DMX 语句执行超时之前等待的秒数。ascmd 命令行实用工具会将 TIMEOUT =<query-timeout> 子句添加到连接字符串。
  • –tcconnect-timeout
    指定 ascmd 连接到 Analysis Services 实例超时之前等待的秒数。ascmd 命令行实用工具会将 CONNECT TIMEOUT = <connect-timeout> 子句添加到连接字符串。
  • –iinput-file
    标识包含 XMLA 脚本、MDX 查询或 DMX 语句的文件。使用 ascmd 命令行实用工具时,必须指定 –i–Q 参数的值。如果 –i–Q 参数都未指定,或这两个参数都已指定,则将生成错误。

    ms365187.note(zh-cn,SQL.90).gif注意:
    sqlcmd 命令行实用工具(可处理多个输入文件)不一样,ascmd 命令行实用工具一次只能处理一个输入文件。如果有多个输入文件,则必须单独调用和执行各个文件。

    使用 –i–Q 参数指定的输入文件必须是有效 XML 结构,且特殊字符必须是以 HTML 编码。例如,在文本中使用“And”字符 (&) 时,必须将其编码为 &amp;。因此,[Product].&1922] 将编码为 [Product].&amp;[1922]。同样,小于号 (<)、大于号 (>) 和双引号 (") 必须分别编码为 &lt;&gt;&quot;。这对于 MDX 查询和 DMX 语句很重要,因为成员键的语法使用“And”字符 (&)。

    ms365187.note(zh-cn,SQL.90).gif注意:
    如果输入文本不像是 XMLA 脚本,即不是以有效 XMLA 命令(例如 <Statement> 或 <Create>)开头(请参见本文档后面的完整列表),则 ascmd 命令行实用工具假定该文本是 <Statement>,并且 HTML 将对该文本进行编码并将其包装在 <Statement> … </Statement> XML 元素标记中。此操作是出于方便而执行的,以便执行 MDX 查询和 DMX 语句变得更加简单。 若要使用 <Statement> 元素并自己编写 HTML 文本,则绝对不会有问题。ascmd 命令行实用工具可以接受任何有效的 XMLA 命令。

    输入文件可包含由 GO 命令分隔的多个批处理。输入文件中的每个批处理都可以包含一个 XMLA 脚本、一个 MDX 查询或一个 DMX 语句。每个 GO 命令必须出现在单个行中。在找到某个 GO 命令时,系统会将该 GO 命令之前的输入发送到服务器。输入流的末尾有一个隐含的 GO 命令。生成的输出文件采用将返回的 XML 流包括在一个 <multiple-batches> 元素中的格式。有关包含多个批处理的输入文件的示例,请参阅方案 11。

    每个批处理都以自己的权限执行,或者成功,或者失败。每个批处理的返回状态记录在输出文件中,您必须分析该文件以确定每个批处理成功与否。

  • –ooutput-file | NUL | NUL:filename
    标识接收 XMLA 脚本结果(XML 格式)的文件或 MDX 查询或 DMX 语句返回的单元集的文件。如果指定的文件已存在,则自动覆盖现有文件。包含空格的文件名必须用引号 ("") 引起来。如果文件名无效,将生成错误消息,且 ascmd 命令行实用工具将退出。

    ascmd 命令行实用工具不支持将多个 ascmd 进程并发写入同一文件。如果尝试这样操作,则文件输出将损坏或出现错误。

    如果指定的输出文件是 NULNUL:filename,则除非 –T 参数用于指定跟踪文件(此种情况下,执行结果存储在跟踪文件中),否则将放弃执行结果。指定 NUL 输出文件,且在使用 –Tl 参数指定 Duration 跟踪级别时,最常使用 –T 参数。

    例如,您可以创建一系列 MDX 查询并使用 ascmd 命令行实用工具执行它们,忽略输出(可能很大),将查询持续时间记录到跟踪文件,然后将跟踪文件中的查询持续时间值加载到数据库。这样,您就可以评估一段时间内的性能变化。您也可以将 Duration-result 跟踪级别与 –Tl 参数一起使用,以将持续时间和执行结果都包括在跟踪文件中。

    ms365187.note(zh-cn,SQL.90).gif注意:
    ascmd 命令行实用工具支持国际编码。输入文件和输出文件使用 UTF-8 编码,并启用字节顺序标记。如果您的文本编辑器不支持 UTF-8,但 MDX 查询、XMLA 脚本或 DMX 语句中包含国际字符,则可以使用记事本将输入文件转换为 UTF-8 格式。若要将输入文件转换为 UTF-8,请在记事本中打开该文件,在“文件”菜单上选择“另存为”,并在“编码”框中选择 UTF-8。然后可以将该文件与 –i 参数一同使用。输入文件和输出文件(–o–T)始终使用 UTF-8 编码和字节顺序标记写入,以确保保留 Unicode 字符。
  • –Ttrace-file
    标识接收 Analysis Services 跟踪事件的文件,这些事件来自执行 XMLA 脚本、MDX 查询或 DMX 语句的 ascmd 命令行实用工具。如果该文件已存在,则自动将其覆盖(但使用 –TlDuration–TlDuration-result 参数设置创建的跟踪文件例外)。包含空格的文件名必须用引号 ("") 引起来。如果文件名无效,将生成错误消息,且 ascmd 命令行实用工具将退出。

    ascmd 命令行实用工具不支持将多个 ascmd 进程并发写入同一文件。如果尝试这样操作,则文件输出将损坏或出现错误。如果未指定 –T 参数,则不捕获跟踪输出,并忽略 –Tf–TlTd–Tt 参数。

    ms365187.note(zh-cn,SQL.90).gif注意:
    使用 http 或 https 访问时,–T 参数不可用。您必须通过指定 –S 参数来使用普通客户端/服务器连接。
  • –xcextended-connect-string
    指定没有进行任何值检查就直接插入连接字符串的扩展连接字符串。该字符串不能包含任何前导或尾随分号 (;)。例如,以下扩展连接字符串会将服务器和 ascmd 进程之间使用的网络数据包大小从 4096 改为 16384,并请求将客户端区域设置为 en-US(美国英语)。

    -xc "Packet Size=16384;LocaleIdentifier=1033"

    ascmd 命令行实用工具默认为不添加任何扩展连接字符串信息。虽然可将 ascmd 命令行实用工具的许多选项作为扩展连接字符串设置实现(例如,通过直接设置 Database=<database name>),但我们还是建议您仅在没有其他机制可用,只能使用扩展连接字符串设置时,才使用标准 ascmd 选项。

  • –Tftext | csv
    指定 –T 参数的文件格式(如果指定了该参数)。其默认值为 csv。可用选项如下所示:

    • 对于 text,文件以文本格式编写。该格式的示例如下:
      <current time> <event-class>.<event-subclass>, [name=value]
    • 对于 csv,文件以逗号分隔的格式编写。默认列分隔符为 |(竖线)。请使用 –Td 参数更改 csv 文件的默认分隔符。文件的第一行指定值的列标题。
  • –Tddelim-char
    使用 –Tf 参数将 csv 指定为跟踪文件的格式时,指定单个字符作为跟踪文件分隔符。默认值为 |(竖线)。
  • –Tttrace-timeout
    指定结束跟踪之前 Analysis Services 引擎等待的秒数(如果指定了 –T 参数)。如果在指定时间段没有记录跟踪消息,则认为跟踪已完成。默认跟踪超时值为 5 秒。
  • –Tltrace-level
    指定在跟踪文件中收集和记录哪些数据。此参数具有以下 5 个可能值:

    • High – 记录所有跟踪事件 - 这是默认设置。
    • Medium – 记录 ProgressReportCurrent 和 Notification 事件之外的所有跟踪事件。
    • Low – 仅记录事件中包含“End”或“Error”的跟踪事件。
    • Duration – 不记录跟踪事件,而是确定 ascmd 进程执行脚本、查询或语句的持续时间。将当前时间、持续时间、执行文本、数据库和服务器名称作为单个条目写入跟踪文件中。
    • Duration-result – 记录与 Duration 设置相同的信息,还记录跟踪文件最后一列的执行结果。
    ms365187.note(zh-cn,SQL.90).gif注意:
    使用 DurationDuration-result 设置生成的跟踪文件不是每次执行都覆盖(与使用 HighMediumLow 设置生成的跟踪文件一样)。相反,使用 DurationDuration-result 设置时,如果存在现有跟踪文件,则将其打开并将新值追加到文件结尾。如果该跟踪文件不存在,则请创建。
  • –Q*"cmdline query or script"*
    直接在命令行中(而不是文件中)指定实际脚本、查询或语句。

    ms365187.note(zh-cn,SQL.90).gif注意:
    sqlcmd 命令行实用工具支持另外一种指定输入查询的方法(使用 –q 参数)。但是,由于该选项从 sysinput 读取,所以无法写入,除非添加更多的语言构造。例如,sqlcmd 使用“go”和“exit”来控制 sysinput 命令。ascmd 命令行实用工具不支持指定查询输入的其他方法。
  • –v var=value...
    指定其他脚本变量。每个变量都是一个 var = value 对。如果值包含嵌入的空格或控制字符,则必须使用双引号 (") 将其引起来。例如,

    -v maxparallel=4 option= "degree of freedom"

    您可以不指定 var = value 对,也可以指定一个或多个。

  • –?/?
    显示 ascmd 命令行实用工具选项的语法摘要。

密钥加密和编译示例

如果尚未创建强名称密钥文件,则请使用以下说明生成该密钥文件。

生成强名称密钥文件

  1. 打开 Microsoft Visual Studio 2005 命令提示符。单击“开始”,依次指向“所有程序”、“Microsoft .NET Framework SDK 2.0”,然后单击“SDK 命令提示符”

    - 或 -

    打开 Microsoft .NET Framework 命令提示符。单击“开始”,依次指向“所有程序”、“Microsoft .NET Framework SDK 2.0”,然后单击“SDK 命令提示符”

  2. 使用更改目录命令 (CD) 将命令提示符窗口的当前目录更改至安装示例的文件夹。

    ms365187.note(zh-cn,SQL.90).gif注意:
    若要确定示例所在的文件夹,请单击“开始”按钮,依次指向“所有程序”、“Microsoft SQL Server”、“文档和教程”,然后单击“示例目录”。如果使用了默认安装位置,则示例将位于 <system_drive>:\Program Files\Microsoft SQL Server\100\Samples 中。
  3. 在命令提示符下,运行以下命令以生成密钥文件:

    sn -k SampleKey.snk

    ms365187.note(zh-cn,SQL.90).gif重要事项:
    有关强名称密钥对的详细信息,请参阅 MSDN 上 .NET 开发中心中的“安全简讯:.NET Framework 中的强名称和安全性”。

可使用以下两种方法之一编译示例:

  • 使用 Visual Studio 2005 - 通过 <install_path>\Samples\Analysis Services\Administrator\ascmd\cs 文件夹中提供的 Visual Studio 解决方案编译示例。

  • 使用 MSBuild(包括在 .NET Framework SDK 2.0 中),通过在命令提示符处运行以下命令编译示例:

    cd Analysis Services\Administrator\ascmd\CS\ascmd
    msbuild ascmd.csproj /nologo /v:quiet /p:Configuration=Debug;Platform=<platform>
    
ms365187.note(zh-cn,SQL.90).gif注意:
Microsoft 基于 x86 和 x64 的计算机完全支持 Visual Studio,但基于 Itanium 的计算机却不支持。一旦编译了 ascmd 命令行实用工具,即可在任何基于 x86、x-64 或 Itanium 的计算机上执行 ascmd 命令行实用工具。

在前面的代码中,<platform> 参数值可以是 x86(针对 32 位计算机)、x64(针对基于 x64 的计算机)或 Itanium(针对基于 IA-64 的计算机)。因为在 64 位计算机上执行 32 位代码时,可能会降低性能,所以最佳方法是编译 ascmd 命令行实用工具的相应版本。

ms365187.note(zh-cn,SQL.90).gif注意:
如果要在体系结构不同于目标计算机的计算机上编译 ascmd 命令行实用工具(例如,要使用 x64Itanium 参数值在 32 位计算机上编译 ascmd 命令行实用工具),则将收到三则警告消息,指示三个单独的系统 DLL 不可用(“…将另一个处理器作为目标”)。这很正常,在意料之中。编译 ascmd 命令行实用工具后,将编译过的可执行文件复制到目标服务器,并从目标服务器(其中包含相应的 DLL)执行它。

使用脚本变量和环境变量。

ascmd 命令行实用工具支持系统保留脚本变量和用户定义脚本变量,您可以将这些变量用于 XMLA 脚本、MDX 查询和 DMS 语句。通过指定环境变量的值或指定命令行参数的值,可填充这些变量的值。

以下规则适用于用户定义脚本变量和环境变量:

  • 变量可包含任意数目的小写字符、大写字符、数字、破折号 (-) 或下划线 (_)。
  • 变量不能包含嵌入的字符或控制字符,如 CR、LF、TAB。

系统保留脚本变量

系统保留脚本变量是指 ascmd 命令行实用工具定义用来保存与各个命令行参数相关联的值的脚本变量。在某些情况下,环境变量还可用于保存这些系统保留脚本变量的值。对于可根据环境变量和命令行参数填充或派生的系统保留脚本变量,为命令行参数指定的值(如果指定)将覆盖任何指定的环境变量值。

下表说明了系统保留脚本变量、关联的命令行参数以及关联的环境变量(如果适用)。

ms365187.note(zh-cn,SQL.90).gif注意:
有三个系统保留脚本变量只能使用命令行参数(–i–o-T 参数)设置。没有对应的 ASCMD 环境变量可用于填充与这三个命令行参数对应的系统保留脚本变量。
系统保留脚本变量 参数 环境变量(如果有)

ASCMDUSER

–U

ASCMDUSER

ASCMDDOMAIN

–U

ASCMDUSER

ASCMDPASSWORD

–P

ASCMDPASSWORD

ASCMDSERVER

–S

ASCMDSERVER

ASCMDINSTANCE

–S

ASCMDSERVER

ASCMDHTTPCONNECTION

–S

ASCMDSERVER

ASCMDDBNAME

d

ASCMDDBNAME

ASCMDINPUTFILE

–i

ASCMDOUTPUTFILE

–o

ASCMDQUERYTIMEOUT

–t

ASCMDQUERYTIMEOUT

ASCMDCONNECTTIMEOUT

–tc

ASCMDCONNECTTIMEOUT

ASCMDTRACEFILE

–T

ASCMDTRACEFORMAT

–Tf

ASCMDTRACEFORMAT

ASCMETRACEDELIM

–Td

ASCMDTRACEDELIM

ASCMDTRACELEVEL

–Tl

ASCMDTRACELEVEL

ASCMDTRACETIMEOUT

–Tt

ASCMDTRACETIMEOUT

ASCMDEXTENDEDCONNECTION

–xc

ASCMDEXTENDEDCONNECTSTRING

注意,在上表的某些情况下,多个系统保留脚本变量从单个参数或环境变量派生。在以下示例中,系统保留脚本变量从 ASCMDSERVER 环境变量设置派生。

  • C:\>SET ASCMDSERVER=http://myserver/my_virtual_dir/msmdpump.dll

前面为 ASCMDSERVER 环境变量指定值的 SET 语句为以下三个系统保留脚本变量设置以下值:

  • ASCMDSERVER="http://myserver/my_virtual_dir/msmdpump.dll"
  • ASCMDINSTANCE=""
  • ASCMDHTTPCONNECTION="true"

在以下示例中,通过使用另一个 SET 语句,使用不同的值填充相同的三个系统保留脚本变量:

  • C:\>SET ASCMDSERVER=myserver\myinstance

前面为 ASCMDSERVER 环境变量指定值的 SET 语句为以下三个系统保留脚本变量设置值:

  • ASCMDSERVER="myserver"
  • ASCMDINSTANCE="myinstance"
  • ASCMDHTTPCONNECTION="false"

在命令提示符下使用系统保留脚本变量

如果存在与系统保留脚本变量匹配的环境变量(匹配区分大小写),则环境变量的值用作系统保留脚本变量和关联的命令行参数的默认值。例如,您可以使用以下 SET 语句来设置 ASCMDDBNAME 环境变量:

  • C:\>SET ASCMDDBNAME="Adventure Works DW"

在这种情况下,在执行 ascmd 命令行实用工具时,“Adventure Works DW”将用作默认数据库(–d 参数)(除非您在命令行指定了不同的值)。

在脚本、查询或语句中使用系统保留脚本变量

在 XMLA 脚本、MDX 查询或 DMX 语句内也可以使用系统保留脚本变量。以下示例说明了使用脚本变量的 ascmd 命令行实用工具的示例命令行调用。本文档后面还有更多的示例说明各种使用方案。

  • C:\>ascmd –S <服务器名称> –i process.xmla -v cube=<多维数据集 ID>
process.xmla(简化)
<Batch>
    <Parallel>
         <Process>
             <Object>
                  <DatabaseID>$(ASCMDDBNAME)</DatabaseID>
                  <CubeID>($CUBE)</CubeID>
            . . .
         </Process>
    </Parallel>
</Batch>

用户定义脚本变量

用户定义脚本变量是指在命令行处使用 -v 参数定义或定义为环境变量的脚本变量。当 ascmd 命令行实用工具在 XMLA 脚本、MDX 查询或 DMX 语句中遇到变量,且未使用 -v 参数填充该变量时,实用工具将检查名称相同的环境变量并使用该变量的值。如果 ascmd 命令行实用工具没有找到匹配环境变量,则将其替换为空白字符串 (""),从而消除该脚本变量。

以下规则适用于在命令行处使用 -v 参数定义的用户定义脚本变量:

  • 从变量的“value”部分删除前导空格和尾随空格。
  • 变量不能以字符串“ascmd”开头。

在输入文件中使用 MDX、XMLA 和 DMX

ascmd 命令行实用工具支持在输入文件内执行 MDX 查询、XMLA 脚本和 DMX 语句。传递给 ascmd 命令行实用工具的输入脚本实际上是 XMLA 命令元素。

命令元素如下:

  • Alter
  • Backup
  • Batch
  • BeginTransaction
  • Cancel
  • ClearCache
  • CommitTransaction
  • Create
  • Delete
  • DesignAggregations
  • Drop
  • Insert
  • Lock
  • MergePartitions
  • NotifyTableChange
  • Process
  • Restore
  • RollbackTransaction
  • Statement(用于执行 MDX 查询和 DMX 语句)
  • Subscribe
  • Synchronize
  • Unlock
  • Update
  • UpdateCells

若要一次对多个对象执行命令,请使用 <批> 命令。若要为 MDX 查询和 DMX 语句执行,请使用 <语句> 命令。有关详细信息,请参阅 SQL Server 2005 联机丛书中的Command Element (XMLA)。以下示例显示如何构造 MDX 查询、DMX 语句和 XMLA 脚本的结构。

ms365187.note(zh-cn,SQL.90).gif重要提示:
与所有 XML 结构一样,命令也区分大小写。因此,您必须将所有 MDX 查询都包括在 <Statement> …</Statement> 标记中。命令必须为“Statement”,而不能为“statement”或“STATEMENT”。

除了 XMLA 命令之外,ascmd 命令行实用工具还可用于执行自定义 XMLA 请求,以实际执行几乎任何以 XMLA 表示的请求。例如,ascmd 命令行实用工具可用于发出以下 XMLA 请求之一:

  • 查询 Analysis Services 元数据的 Discover XMLA 请求。此元数据包含有关以下各项的信息:
    • 存储在 Analysis Services 数据库中的对象(例如服务器上定义的多维数据集);以及
    • 所用的资源(例如服务器上打开的连接)。
  • 执行命令但会通过指定属性列表和参数列表修改命令的 Execute 请求。本文档的后面提供了此类请求的示例 - 请参阅“Execute 示例”。

如果输入文本的格式不是 XMLA 命令、Discover 请求或 Execute 请求,则 ascmd 命令行实用工具假定输入文本是 MDX 查询或 DMX 语句。这种情况下,ascmd 命令行实用工具将对文本进行 HTML 编码,然后将其封装在 <Statement> … </Statement> 元素中并作为 XMLA 命令来处理。这样,您就可以轻松地输入 MDX 查询或 DMX 语句了。有关如何使用此功能的示例,请参见本文档后面的“方案 1:查询 Analysis Services 多维数据集”。

MDX 示例:

<Statement>
SELECT NON EMPTY
         [Employees].Members ON ROWS,
         [Measures].[Internet Gross Profit] ON COLUMNS 
FROM [Adventure Works]
</Statement>

此示例在 XMLA 语句中使用 MDX 查询,为 Adventure Works 多维数据集中非空的 Employees 属性层次结构的每个成员返回 Internet Gross Profit 度量值。

DMX 示例:

<Statement>
ALTER MINING STRUCTURE [Bike Buyer]
ADD MINING MODEL [Decision Tree]
(
    [Customer Key],
    [Age],
    [Bike Buyer] PREDICT,
    [Commute Distance],
    [Education],
    [Gender],
    [House Owner Flag],
    [Marital Status],
    [Number Cars Owned],
    [Number Children At Home],
    [Occupation],
    [Region],
    [Total Children],
    [Yearly Income]
) USING Microsoft_Decision_Trees
WITH DRILLTHROUGH
</Statement>

此示例在 XMLA 语句中使用 DMX 查询并通过添加新挖掘模型来更改 [Bike Buyer] 挖掘结构。

XMLA 示例:

<Batch xmlns="https://schemas.microsoft.com/analysisservices/2003/engine">
   <Parallel>
      <Process xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <Object>
            <DatabaseID>Adventure Works DW</DatabaseID>
            <CubeID>Adventure Works DW</CubeID>
            <MeasureGroupID>Fact Internet Sales 1</MeasureGroupID>
            <PartitionID>Internet_Sales_2001</PartitionID>
         </Object>
         <Type>ProcessFull</Type>
         <WriteBackTableCreation>UseExisting</WriteBackTableCreation>
      </Process>
   </Parallel>
</Batch>

此示例使用 XMLA 语句完整处理 Internet_Sales_2001 分区。

Discover 示例:

<Discover xmlns="urn:schemas-microsoft-com:xml-analysis">
   <RequestType>MDSCHEMA_CUBES</RequestType>
   <Restrictions>
      <RestrictionList>
         <CATALOG_NAME>Adventure Works DW</CATALOG_NAME>
      </RestrictionList>
   </Restrictions>
   <Properties>
      <PropertyList>
         <Catalog>Adventure Works DW</Catalog>
         <Format>Tabular</Format>
      </PropertyList>
   </Properties>
</Discover>

此示例使用 XMLA Discover 请求返回 Adventure Works DW 数据库中可用的多维数据集。因为透视被当作多维数据集返回给应用程序,所以返回的数据实际上同时包含多维数据集和透视。

Execute 示例:

<Execute xmlns="urn:schemas-microsoft-com:xml-analysis">
   <Command>
      <Statement>
         SELECT [Measures].MEMBERS ON COLUMNS FROM [Adventure Works]
      </Statement>
   </Command>
   <Properties>
      <PropertyList>
         <Catalog>Adventure Works DW</Catalog>
         <Format>Tabular</Format>
         <AxisFormat>ClusterFormat</AxisFormat>
      </PropertyList>
   </Properties>
</Execute>

此示例在 XMLA 语句中使用 MDX 查询。但是请注意,XMLA 请求的属性列表部分将返回格式指定为 Tabular(表格)而不是 Multidimensional(多维)。多维格式是 XMLA 语句命令的默认格式。 因为返回格式为表格(行集)格式,所以理解 XSD 平展行集而不是单元集的应用程序可以使用输出文件,并且由于现在的格式为表格,因此平展行集可以更轻松地加载到 SQL 关系数据库中。

ASCMD 方案示例

以下方案说明了 ascmd 命令行实用工具的各种使用方法。

方案 1:查询 Analysis Services 多维数据集

在此方案中,将创建包含 MDX 查询的输入文件(query.mdx 文件),此文件在 MDX 查询中包含用户定义的脚本变量 (cube)。接着,您可以从 ascmd 命令行实用工具调用此输入文件,并使用 -v 参数在命令行处指定此变量的值。

query.mdx 文件:

格式 1:

<Statement>
/* THIS IS AN MDX COMMENT */
SELECT [Measures].[Internet Sales Amount] ON COLUMNS
FROM $(cube)
WHERE [Customer].[Country].&amp;[United States]
</Statement>

格式 2:

/* THIS IS AN MDX COMMENT */
SELECT [Measures].[Internet Sales Amount] ON COLUMNS
FROM $(cube)
WHERE [Customer].[Country].&[United States]
命令行示例:

C:\>ascmd -S myserver –d "Adventure Works DW" –i query.mdx -o result.xml –v cube="[Adventure Works]"

请注意,使用格式 1 时,通过将 MDX "&"(指示其是成员键而不是名称)替换为 &amp;(HTML 编码需要)来处理 United States 的键,并且指定了 <Statement> 元素。请注意,使用格式 2 时,既不需要 HTML 编码,也不需要 <Statement> 元素。这是因为输入文本不是以有效 XMLA 命令开头的,因而 ascmd 命令行实用工具假定输入文本是一个语句,在执行之前自动对输入进行 HTML 编码并将其封装在 <Statement> 元素中。

方案 2:在不可信的域中备份数据库

在此方案中,将使用 ascmd 命令行实用工具在不可信的域中的某个服务器上备份数据库。因为数据库位于不可信的域中,所以此方案需要 HTTP 访问。在此方案中,远程服务器(名为“myserver”)同时运行 Internet 信息服务 (IIS) 和 Analysis Services,并具有使用 BASIC 身份验证配置、名为“olapadmin”的 IIS 虚拟目录。此外,该远程服务器还拥有相应备份权限、名为“olapadmin”的本地帐户。您可以使用 ascmd 命令行参数在命令行指定数据库名称、访问方法、用户名、密码和备份文件,并指定包含数据库和备份文件的脚本变量的 XMLA 输入文件 (backup.xmla)。

backup.xmla 文件:
<Backup xmlns="https://schemas.microsoft.com/analysisservices/2003/engine">
   <Object>
      <DatabaseID>$(ascmddbname)</DatabaseID>
   </Object>
   <File>$(backupfile).abf</File>
</Backup>
命令行示例:

C:\>ascmd -S https://myserver/msolap90/msmdpump.dll -U myserver\olapadmin -P #1PWD -d "Adventure Works DW" -i backup.xmla -v backupfile="AdvWorks"

注意,在此命令行示例中,使用 https 是为了通过网络将密码发送到远程服务器时,可以对其进行加密。

方案 3:处理多个分区

在此方案中,将使用 ascmd 命令行实用工具处理多个分区。您将使用 XMLA 处理脚本 (process.xmla) 中的脚本变量指定并行度、数据库名称和多维数据集名称以及进程类型。此 XMLA 脚本还说明了如何在 XMLA 脚本内使用注释。从 ascmd 命令行实用工具调用 process.xmla 处理脚本时,您可在批处理 bat 文件 (process.bat) 中指定服务器和数据库名称、XMLA 结果输出文件、跟踪事件的跟踪文件、跟踪级别以及并行度。如果处理时管理员正在监视系统,则跟踪文件包含的事件和信息与 SQL Server Profiler返回的相同。

process.xmla 文件:
<Batch xmlns="https://schemas.microsoft.com/analysisservices/2003/engine">
   <Parallel maxparallel="$(MAXPARALLEL)">
   <!-- SEE ABOVE FOR HOW MANY PARITIONS PROCESSED IN PARALLEL -->
      <Process xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <Object>
            <DatabaseID>$(ASCMDDBNAME)</DatabaseID>
            <CubeID>$(ASCMDDBNAME)</CubeID>
            <!-- Just so happens CubeID=DatabaseID=Database name :-) -->
            <MeasureGroupID>Fact Internet Sales 1</MeasureGroupID>
            <PartitionID>Internet_Sales_2001</PartitionID>
         </Object>
         <Type>$(PROCESSTYPE)</Type>
         <WriteBackTableCreation>UseExisting</WriteBackTableCreation>
      </Process>
      <Process xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <Object>
            <DatabaseID>$(ASCMDDBNAME)</DatabaseID>
            <CubeID>$(ASCMDDBNAME)</CubeID>
            <MeasureGroupID>Fact Internet Sales 1</MeasureGroupID>
            <PartitionID>Internet_Sales_2002</PartitionID>
         </Object>
         <Type>$(PROCESSTYPE)</Type>
         <WriteBackTableCreation>UseExisting</WriteBackTableCreation>
      </Process>
      <Process xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <Object>
            <DatabaseID>$(ASCMDDBNAME)</DatabaseID>
            <CubeID>$(ASCMDDBNAME)</CubeID>
            <MeasureGroupID>Fact Internet Sales 1</MeasureGroupID>
            <PartitionID>Internet_Sales_2004</PartitionID>
         </Object>
         <Type>$(PROCESSTYPE)</Type>
         <WriteBackTableCreation>UseExisting</WriteBackTableCreation>
      </Process>
      <Process xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <Object>
            <DatabaseID>$(ASCMDDBNAME)</DatabaseID>
            <CubeID>$(ASCMDDBNAME)</CubeID>
            <MeasureGroupID>Fact Internet Sales 1</MeasureGroupID>
            <PartitionID>Internet_Sales_2003</PartitionID>
         </Object>
         <Type>$(PROCESSTYPE)</Type>
         <WriteBackTableCreation>UseExisting</WriteBackTableCreation>
      </Process>
   </Parallel>
</Batch>
process.bat 文件:
@echo off
call :generate-timestamp
ascmd -S myserver -d "Adventure Works DW" -i process.xmla
         -o process.xml -T process-%timestamp%.csv -Tl medium 
         -v maxparallel=4 processtype=ProcessFull
if ERRORLEVEL 1 goto errseen
goto :EOF
:errseen
echo ** Error seen in processing
goto :EOF

:generate-timestamp
set now_date=%date%
set now_time=%time%
set now_Year=%now_date:~10,4%
set now_Month=%now_date:~4,2%
set now_Day=%now_date:~7,2%
set now_Hour=%now_time:~0,2%
set now_Min=%now_time:~3,2%
if "%now_Hour:~0,1%"==" " set now_Hour=0%now_Hour:~1,1%
set timestamp=%now_year%%now_month%%now_day%_%now_hour%%now_min%
goto :EOF

注意,批处理文件在输出文件中使用时间戳,以便可同时记录多个运行。

方案 4:在服务器上创建新的数据库

在此方案中,将使用 ascmd 命令行实用工具调用 XMLA 脚本文件 (create.xmla),以在服务器上创建新的数据库。数据库名称使用用户定义脚本变量在 XMLA 脚本中定义,而此变量的值使用 -v 参数在命令行处定义。

create.xmla 文件:

该文件使用 SQL Server Management Studio 创建。若要创建您自己的文件,请右键单击数据库,然后在**“脚本”菜单上单击“创建”**。

<Create xmlns="https://schemas.microsoft.com/analysisservices/2003/engine">
      <ObjectDefinition>
            <Database xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                  <ID>$(dbname)</ID>
                  <Name>$(dbname)</Name>
                  <Description>A Unified Dimensional Model that encompasses the Adventure Works data warehouse.</Description>
                  <Language>1033</Language>
                  <Collation>Latin1_General_CI_AS</Collation>
                  <DataSourceImpersonationInfo>
                     <ImpersonationMode>Default</ImpersonationMode>
                  </DataSourceImpersonationInfo>
                  <Dimensions>
                        <Dimension>
                              <ID>Dim Promotion</ID>
                              <Name>Promotion</Name>
                              <Annotations>
 . . .
命令行示例:

C:\>ascmd -S myserver -i create.xmla -v dbname="My Adventure Works DW"

在前面的 XMLA 脚本中,您还可以使用脚本变量配置各种对象,如到数据源的连接字符串、用于数据源的服务器和数据库名称或数据源视图中的各个字段名称。

方案 5:创建缓存准备器应用程序

在此方案中,将使用批处理文件 (cache_warmer.bat) 调用 ascmd 命令行实用工具,以调用若干个用于准备 Analysis Services 数据缓存的 MDX 查询。例如,您可以在每天凌晨 2:00 或夜间批加载后使用 SQL Server 代理调用此批处理文件。在该批处理文件中,您可设置服务器名称、数据库名称和多位数据集名称的环境变量。因为指定为环境变量的服务器名称和数据库名称与系统保留脚本变量的名称完全匹配,所以它们成为 –S–d 命令行参数的默认值。所有 MDX 查询都使用了多维数据集名称的用户定义脚本变量。

query1.mdx 文件:

文件:格式为 query1.txt 的 query1.mdx 至 query6.mdx

<Statement>
SELECT [Measures].[Internet Sales Amount] ON COLUMNS
FROM $(cube)
WHERE [Customer].[Country].&amp;[United States]
</Statement>

通过在 Adventure Works 中将 [United States] 替换为其他国家/地区([Australia]、[Canada]、[France]、[Germany] 或 [United Kingdom])创建其他查询文件。

cache_warmer.bat 文件:
set ascmdserver=myserver
set ascmddbname=Adventure Works DW
set cube=[Adventure Works]

set QUERYDIR=..\queries
set OUTPUTDIR=..\queries
echo -------------------------
set f=
for %%f in (%QUERYDIR%\*.mdx) do (
    call :query %%f
            if ERRORLEVEL 1 goto :EOF
)
echo -------------------------
echo Done.
goto :EOF

:query
echo Query: %1
echo ---------
ascmd -T %OUTPUTDIR%\querylog.txt -Tl duration 
         -Tf text -o %OUTPUTDIR%\%~n1.xml -i %1
echo Errorlevel: %ERRORLEVEL%
echo -------------------------
if ERRORLEVEL 1 goto :errseen
goto :EOF

:errseen
echo -------------------------
echo   ******
echo   ****** ERROR SEEN ******
echo   ******   Exiting    ******
goto :EOF

方案 6:创建验证过程

在此方案中,将使用 ascmd 命令行实用工具在夜间 ETL 运行结束时调用若干个 MDX 查询文件(与前面的方案类似)。您将使用 –Tl 持续时间参数将每个 MDX 查询的持续时间都记录到跟踪文件,同时将 MDX 脚本输出定向到 nul 文件 (-iNUL)。您还可以在将执行结果记录到跟踪日志时使用 –Tl 持续时间参数。以这种方式使用 ascmd 命令行实用工具让您可以跟踪每个 MDX 查询所需的时间,还可以每天比较这些结果以确保返回的值在同一范围内。如果给定日的持续时间结果大大超出范围,则可能表示必须取消 ETL 运行结果。

命令行示例:

C:\>ascmd -i %queryfile% -o NUL -T querylog.csv -Tl duration

方案 7:自动化数据挖掘模型的生成和定型

在此方案中,将使用 ascmd 命令行实用工具调用一系列 DMX 语句,如下所示:

  • DMX 语句 (Bike Buyer Structure.DMX),创建挖掘结构并使用环境变量设置服务器名称和数据库名称。
  • DMX 语句 (Clustering_Model.dmx),向结构添加聚类分析挖掘模型。
  • DMX 语句 (DT_Model.dmx),向结构添加决策树挖掘模型。
  • DMX 语句 (Process Bike Buyer Structure.dmx),处理挖掘结构和挖掘模型。

挖掘结构就绪后,就可以使用 ascmd 命令行实用工具调用若干个 DMX 语句,使用不同的挖掘模型查询挖掘结构。

创建挖掘结构

Bike Buyer Structure.dmx 文件:
<Statement>
CREATE MINING STRUCTURE [Bike Buyer]
(
    [Customer Key] LONG KEY,
    [Age]LONG DISCRETIZED(Automatic,10),
    [Bike Buyer] LONG DISCRETE,
    [Commute Distance] TEXT DISCRETE,
    [Education] TEXT DISCRETE,
    [Gender] TEXT DISCRETE,
    [House Owner Flag] TEXT DISCRETE,
    [Marital Status] TEXT DISCRETE,
    [Number Cars Owned]LONG DISCRETE,
    [Number Children At Home]LONG DISCRETE,
    [Occupation] TEXT DISCRETE,
    [Region] TEXT DISCRETE,
    [Total Children]LONG DISCRETE,
    [Yearly Income] DOUBLE CONTINUOUS
)
</Statement>

命令行示例:

C:\>set ascmdserver=myserver

C:\>set ascmddbname=Adventure Works DW

C:\>ascmd -i "Bike Buyer Structure.dmx"

在结构中添加聚类分析挖掘模型

Clustering_Model.dmx 文件:
<Statement>
ALTER MINING STRUCTURE [Bike Buyer]
ADD MINING MODEL [Clustering]
USING Microsoft_Clustering 
</Statement>

命令行示例:

C:\>ascmd -i "Clustering_Model.dmx"

在结构中添加决策树挖掘模型

DT_Model.dmx 文件
<Statement>
ALTER MINING STRUCTURE [Bike Buyer]
ADD MINING MODEL [Decision Tree]
(
    [Customer Key],
    [Age],
    [Bike Buyer] PREDICT,
    [Commute Distance],
    [Education],
    [Gender],
    [House Owner Flag],
    [Marital Status],
    [Number Cars Owned],
    [Number Children At Home],
    [Occupation],
    [Region],
    [Total Children],
    [Yearly Income]
) USING Microsoft_Decision_Trees
WITH DRILLTHROUGH
</Statement>
命令行示例:

C:\>ascmd -i "DT_Model.dmx"

处理挖掘结构和挖掘模型

处理 Bike Buyer Structure.dmx 文件:
<Statement>
INSERT INTO MINING STRUCTURE [Bike Buyer]
(
    [Customer Key],
    [Age],
    [Bike Buyer],
    [Commute Distance],
    [Education],
    [Gender],
    [House Owner Flag],
    [Marital Status],
    [Number Cars Owned],
    [Number Children At Home],
    [Occupation],
    [Region],
    [Total Children],
    [Yearly Income]
)
OPENQUERY([$(ASCMDDBNAME)],
    'SELECT CustomerKey, Age, BikeBuyer,
             CommuteDistance,EnglishEducation,
             Gender,HouseOwnerFlag,MaritalStatus,
             NumberCarsOwned,NumberChildrenAtHome, 
             EnglishOccupation,Region,TotalChildren,
             YearlyIncome 
      FROM dbo.vTargetMail')
</Statement>
命令行示例:

C:\>ascmd -i "DT_Model.dmx"

使用决策树挖掘模型查询结构

SELECT_DRILLTHROUGH.dmx 文件:
<Statement>
SELECT * 
FROM [Decision Tree].CASES
</Statement>
BATCH_PREDICTION.dmx 文件:
<Statement>
SELECT
   TOP 10
   t.[LastName],
   t.[FirstName],
   [Decision Tree].[Bike Buyer],
   PredictProbability([Bike Buyer])
From
   [Decision Tree]
PREDICTION JOIN
 OPENQUERY([$(ASCMDDBNAME)],
      'SELECT
         [LastName],
         [FirstName],
         [MaritalStatus],
         [Gender],
         [YearlyIncome],
         [TotalChildren],
         [NumberChildrenAtHome],
         [Education],
         [Occupation],
         [HouseOwnerFlag],
         [NumberCarsOwned]
      FROM
         [dbo].[ProspectiveBuyer]
      ') AS t
ON
   [Decision Tree].[Marital Status] = t.[MaritalStatus] AND
   [Decision Tree].[Gender] = t.[Gender] AND
   [Decision Tree].[Yearly Income] = t.[YearlyIncome] AND
   [Decision Tree].[Total Children] = t.[TotalChildren] AND
   [Decision Tree].[Number Children At Home] = t.[NumberChildrenAtHome] AND
   [Decision Tree].[Education] = t.[Education] AND
   [Decision Tree].[Occupation] = t.[Occupation] AND
   [Decision Tree].[House Owner Flag] = t.[HouseOwnerFlag] AND
   [Decision Tree].[Number Cars Owned] = t.[NumberCarsOwned]
WHERE [Decision Tree].[Bike Buyer] =1
ORDER BY PredictProbability([Bike Buyer]) DESC
</Statement>
SELECT_DISCRETE.dmx 文件:
<Statement>
SELECT DISTINCT [Bike Buyer] 
FROM [Decision Tree]
</Statement>
命令行示例:

C:\>ascmd -i SELECT_DRILLTHROUGH.dmx

C:\>ascmd -i BATCH_PERDICTION.dmx

C:\>ascmd -i SELECT_DISCRETE.dmx

方案 8:清除 Analysis Services 数据缓存

在此方案中,将使用 ascmd 命令行实用工具调用某个 XMLA 脚本 ClearCache.xmla),此脚本在执行性能研究时将清除性能运行之间的 Analysis Services 数据缓存。ClearCache.xmla 文件包含数据库名称和多维数据集名称的脚本变量。此 XMLA 脚本由指定服务器名称和实例名、数据库名称、输入文件名、输出文件名和多维数据集名称的批处理文件 (ClearCache.bat) 调用。

ClearCache.xmla 文件:
<Batch xmlns="https://schemas.microsoft.com/analysisservices/2003/engine">
   <ClearCache>
               <Object>
                      <DatabaseID>$(ASCMDDBNAME)</DatabaseID>
                      <CubeID>$(CUBE)</CubeID>
               </Object>
       </ClearCache>
</Batch> 
ClearCache.bat 文件:
@echo off
ascmd -S myserver\myinstance -d "Adventure Works DW" -i ClearCache.xmla
         -o ClearCache.xml -v cube="Adventure Works DW"

if ERRORLEVEL 1 goto :errseen
goto :EOF

:errseen
echo **** Error seen ****
echo ********************
goto :EOF

方案 9:确定当前连接到服务器的用户

在此方案中,将使用 ascmd 命令行实用工具检索服务器上的活动连接列表。应用程序可以使用此信息来延迟处理直至特定的用户断开连接,或在有人使用当前连接(用于夜间批处理运行的连接除外)时向操作员发送电子邮件。

connections.xmla 文件:
<Discover xmlns="urn:schemas-microsoft-com:xml-analysis">
   <RequestType>DISCOVER_CONNECTIONS</RequestType>
   <Restrictions />
   <Properties>
      <PropertyList>
         <Content>Data</Content>     <!-- Only the data; no schema -->
      </PropertyList>
   </Properties>
</Discover>
命令行示例:

C:\>ascmd -S myserver -i connections.xmla -o current_connections.xml

方案 10:是否处理了分区,如果是的话,上次处理时间是在什么时候

在此方案中,将使用 ascmd 命令行实用工具确定是否已经处理了分区以及是在何时处理的。可以轻松地检索此信息,因为它是作为分区对象的属性存储的。因此,可以使用 DISCOVER_XML_METADATA 请求检索此信息。

connections.xmla 文件:
<Discover xmlns="urn:schemas-microsoft-com:xml-analysis">
   <RequestType>DISCOVER_XML_METADATA</RequestType>
   <Restrictions>
      <RestrictionList>
        <DatabaseID>$(DatabaseID)</DatabaseID>
        <CubeID>$(CubeID)</CubeID>
        <MeasureGroupID>$(MeasureGroupID)</MeasureGroupID>
        <PartitionID>$(PartitionID)</PartitionID>
      <!-- Ask for just this object referenced -->
      <ObjectExpansion>ReferenceOnly</ObjectExpansion>
      </RestrictionList>
   </Restrictions>
   <Properties>
      <PropertyList>
         <Content>Data</Content>     <!-- Only the data; no schema -->
      </PropertyList>
   </Properties>
</Discover>

方案 11:使用 GO 命令执行写回操作

在此方案中,您使用 ascmd 命令行实用工具将写回操作细分为两部分:更改数据,然后提交数据。写回操作要求使用 GO 命令,因为写回操作所需的两个 MDX 语句(UPDATE CUBE 和 COMMIT TRANSACTION 语句)必须在同一事务中相继先后发出。MDX 不支持在同一批处理中发出这两个语句。

对于此方案,您需要修改 Adventure Works DW 数据库以支持写回。现有数据库目前没有支持写回的多维数据集示例。若要创建并验证支持写回的多维数据集,请执行以下步骤:

  1. 定义名为“Writeback”的新多维数据集

  2. 打开 Business Intelligence Development Studio。

  3. 在“文件”菜单上,指向**“打开”,再单击“Analysis Services 数据库”**。

  4. 在**“连接到数据库”对话框中,在“服务器”文本框中键入您的服务器名,在“数据库”列表中选择“Adventure Works DW”数据库,再单击“确定”**。

  5. 在“解决方案资源管理器”窗格中,右键单击**“多维数据集”,再单击“新建多维数据集”**。

  6. 在多维数据集向导中,单击**“欢迎使用多维数据集向导”页上的“下一步”,选择“使用数据源生成多维数据集”,清除“自动生成”复选框,再单击“下一步”**。

  7. 在**“选择数据源视图”页上,在“可用数据源视图”列表中选择“Adventure Works DW”,再单击“下一步”**。

  8. 在**“标识事实数据表和维度表”页上,选中 FactSalesQuota 表的“事实数据”复选框,选中 dbo.DimTimedbo.DimEmployee 表的“维度”复选框,再单击“下一步”**。

  9. dbo.DimTime(维度名为“Date”)dbo.DimEmployeeFactSalesQuota(仅使用“Sales Amount Quota”度量值)

  10. 在**“查看共享维度”页上,在“可用维度”列表中选择“Date”“Employee”,单击 > 将这些维度添加到“多维数据集维度”列表中,再单击“下一步”**。

  11. 在**“选择度量值”页上,清除“Fact Sales Quota”复选框,选中“Sales Amount Quota”复选框,再单击“下一步”**。

  12. 在**“完成向导”页上,将多维数据集名称更改为 Writeback,再单击“完成”**。

  13. 为 Fact Sales Quota 度量值组启用写回

  14. 在多维数据集设计器中,选择**“分区”**选项卡。

  15. 右键单击分区列表中的**“Fact Sales Quota”分区,再单击“写回设置”**。

  16. 在**“启用写回 - Fact Sales Quota”对话框中,检查默认的写回表名,然后单击“确定”**创建此表并为此分区启用写回。

  17. 请注意,现在会出现两个分区:一个用于事实数据表;一个用于写回表。

  18. 处理 Writeback 多维数据集

  19. 在解决方案资源管理器中右键单击**“多维数据集”节点下的“Writeback”,再单击“处理”**。

  20. 如果提示您保存所做更改,请单击**“是”**。

  21. 在**“处理多维数据集 - Writeback”对话框中,单击“运行”**。

  22. 如果展开处理命令,会看到用于创建写回关系表的 CREATE TABLE SQL 语句。

  23. 处理完成后,在**“状态”框中确认已成功完成处理,然后单击“关闭”**。

  24. 再次单击“关闭”以关闭**“处理分区 - WriteTable_Fact Sales Quota”**对话框。

  25. 关闭 Business Intelligence Development Studio。

  26. 验证已正确执行写回

  27. 打开 SQL Server Management Studio。

  28. 连接到您的服务器,然后在**“对象资源管理器”中展开“数据库”,右键单击“Adventure Works DW”,指向“新建查询”,再单击“MDX”**。

  29. 在 MDX 查询窗口中,执行以下 MDX 查询以返回 Q1FY2002 和 Stephen Y. Jiang 的当前销售额:

    /* Employee 272 is [Stephen Y. Jiang]*/
    SELECT [Measures].[Sales Amount Quota] ON COLUMNS
    FROM [Writeback]
    WHERE ([Employee].[Employee].[Stephen Y. Jiang],[Date].[Calendar].[Calendar Quarter].[Q1 CY 2002])
    
  30. 通过发出以下 MDX 语句修改该单元以返回 $2,200:

    UPDATE CUBE [Writeback]
    SET ([Employee].[Employee].[Stephen Y. Jiang],
    [Date].[Calendar].[Calendar Quarter].[Q1 CY 2002]) = 2200
    
  31. 通过执行以下 MDX 语句提交事务:

    COMMIT TRANSACTION
    

    此时,您可以检查 Adventure Works DW 关系数据库中的 dbo.WriteTable_Fact Sales Quota 表以查看为该单元实际执行的写回。检查后,您会注意到写入此关系表的是增量 (-88800)。原始事实数据表未发生更改。

writeback.mdx 文件:
/* What is the existing value? */
SELECT [Measures].[Sales Amount Quota] ON COLUMNS
FROM [Writeback]
WHERE ([Employee].[Employee].&[272],
[Date].[Calendar].[Calendar Quarter].&[2002]&[1])
GO
/* Update the cube with a new value */
UPDATE CUBE [Writeback]
SET ([Employee].[Employee].&[272],
[Date].[Calendar].[Calendar Quarter].&[2002]&[1]) = 33000 /* some different value */
GO
/* Commit it */
Commit Transaction
GO
/* See what the updated value is */
SELECT [Measures].[Sales Amount Quota] ON COLUMNS
FROM [Writeback]
WHERE ([Employee].[Employee].&[272],
[Date].[Calendar].[Calendar Quarter].&[2002]&[1])
GO
命令行示例:

C:\>ascmd -S myserver -d "Adventure Works DW" -i writeback.mdx -o writeback_result.xml -v cube="[Writeback]"

Writeback_result.xml:
<multiple-batches>
   <return xmlns="urn:schemas-microsoft-com:xml-analysis">
      <root xmlns= . . .>
         <...metadata about the result set...>
<CellData xmlns="urn:schemas-microsoft-com:xml-analysis:mddataset">
  <Cell CellOrdinal="0">
     <Value xsi:type="xsd:double" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">0</Value> 
     <FmtValue>2200</FmtValue> 
  </Cell>
</CellData>
      </root>
   </return>
   <return xmlns="urn:schemas-microsoft-com:xml-analysis">
      <root xmlns="urn:schemas-microsoft-com:xml-analysis:empty" /> 
   </return>
   <return xmlns="urn:schemas-microsoft-com:xml-analysis">
      <root xmlns="urn:schemas-microsoft-com:xml-analysis:empty" /> 
   </return>
   <return xmlns="urn:schemas-microsoft-com:xml-analysis">
      <root xmlns= . . .>
         <...metadata about the result set...>
<CellData xmlns="urn:schemas-microsoft-com:xml-analysis:mddataset">
  <Cell CellOrdinal="0">
     <Value xsi:type="xsd:double" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">0</Value> 
     <FmtValue>33000</FmtValue> 
  </Cell>
</CellData>
      </root>
   </return>
</multiple-batches>

请注意,在 UPDATE CUBE 语句与 COMMIT TRANSACTION 语句的中间有两个空结果集。

发布日期 历史记录

2006 年 12 月 12 日

更改的内容:
  • 记录了一个新功能 - 对多个批处理的支持。
  • 增加了说明新功能用法的示例。

2006 年 7 月 17 日

更改的内容:
  • 提供了两个新功能的文字说明 - 自定义 XMLA 请求和输入流中命令类型的自动检测。
  • 增加了说明新功能用法的更新示例。

请参阅

其他资源

XML for Analysis (XMLA)
XML for Analysis Reference (XMLA)
Discover Method (XMLA)
Execute Method (XMLA)

帮助和信息

获取 SQL Server 2005 帮助