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 Agent 內建的 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 相關的工作。對於任何指定的工作,您都可以透過使用者介面或是以程式設計方式來處理實作。
- Analysis Management Objects (AMO)
若要在沒有安裝 Analysis Services 的電腦上執行 ascmd 命令列公用程式,需要用到 AMO。您可以從 SQL Server 2005 Feature Pack 安裝 AMO,而該 Feature Pack 可以從 Microsoft 下載中心下載,網址為:https://www.microsoft.com/downloads。
- .NET Framework 2.0
若要執行 ascmd 命令列公用程式,需要有 .NET Framework 2.0。可以從 Microsoft 下載中心 (網址為 https://www.microsoft.com/downloads) 下載。
- 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 (請參閱本文件後面的「編譯範例」安裝)。
SQL Server 2005 隨附的 Adventure Works DW 資料庫
資料庫範例有助於 ascmd 命令列公用程式的試驗。如需詳細資訊,請參閱《SQL Server 2005 線上叢書》中的<執行安裝程式來安裝 AdventureWorks 範例資料庫和範例>。您也可以在 SQL Server 開發人員中心網頁下載 AdventureWorks 資料庫的更新版本。
您也可以在 SQL Server 開發人員中心網頁下載 SQL Server 2005 Database Engine 範例的更新版本。
引數
以下是在 ascmd 的命令列上支援的引數。
-Ulogin_id
這是使用者登入識別碼,會區分大小寫。附註: sqlcmd 和 ascmd 的 login_id 用法各有不同。在 sqlcmd,login_id 代表 SQL Server 登入,而在 ascmd 則代表 Windows 登入。 如果是 TCP/IP 存取,Analysis Services 只支援信任連接。如果指定了 –U 參數 (並使用 –P 參數搭配相對應的密碼),ascmd 命令列公用程式就會使用指定的帳戶登入 Windows 作業系統,然後在執行 XMLA 指令碼、MDX 查詢或 DMX 陳述式時模擬該帳戶。登入識別碼必須使用下列格式:<domain>\<username>,並且必須指定網域。如果沒有指定 –U,則會根據執行 ascmd 命令列公用程式之使用者的 Windows 帳戶進行驗證。
如果由 –S 參數指定了 http (或 https) 連接,則 ascmd 命令列公用程式不會登入 Windows 作業系統。而是包含 -U 及 -P 參數 (如果存在) 作為 Internet Information Services (IIS) 伺服器連接字串的一部分。然後,視 IIS 設定方式而定,–U 及 –P 參數都可用於基本驗證。如需有關 "UID" 連接字串參數的詳細資訊,請參閱《SQL Server 2005 線上叢書》中的<AdomdConnection 類別>。
-Ppassword
這是使用者指定並對應於 -U 參數的密碼。如果指定了 –U 參數,但沒有指定 –P 參數,則會假設密碼是空白 (零長度的空字串)。如果指定了 –P 參數,而沒有指定 –U 參數,則會忽略 –P 參數。安全性注意事項: 密碼不能空白。請使用增強式密碼。如需詳細資訊,請參閱《SQL Server 2005 線上叢書》中的<增強式密碼>。 -P 參數密碼是以純文字儲存在指令碼、查詢或陳述式檔案中,可以看到電腦螢幕或讀取檔案本身的任何人都能檢視此密碼。如果您使用這個功能,請對檔案設定 ACL 或使用其他安全性技術,確保只有信任的使用者才能讀取檔案。
- –Sserver\instance 或 –Shttp[s]://server[:port]/virtualdirectory/msmdpump.dll
指定 ascmd 命令列公用程式將會連接並執行的 Analysis Services 執行個體。如果沒有指定 –P 參數,ascmd 命令列公用程式就會連接到執行 TCP 之本機電腦上 Analysis Services 的預設執行個體 (連接到 localhost),並執行 XMLA 指令碼、MDX 查詢或 DMX 陳述式。
- -ddatabase
指定將會對其執行 MDX 查詢或 DMX 陳述式的資料庫。因為資料庫名稱是內嵌在 XMLA 指令碼中,當 ascmd 命令列公用程式執行 XMLA 指令碼時,會忽略 -d 參數。
- -tquery-timeout
指定 XMLA 指令碼、MDX 查詢或 DMX 陳述式執行逾時之前的秒數。ascmd 命令列公用程式會將 TIMEOUT =<query-timeout> 子句加入至連接字串。
- -tcconnect-timeout
指定 Analysis Services 執行個體之 ascmd 連接逾時之前的秒數。ascmd 命令列公用程式會將 CONNECT TIMEOUT = <connect-timeout> 子句加入至連接字串。
-iinput-file
識別包含了 XMLA 指令碼、MDX 查詢或 DMX 陳述式的檔案。當您使用 ascmd 命令列公用程式時,必須指定 -i 或 -Q 的值。同時指定或完全沒有指定 –i 或 –Q 這兩個參數,都會產生錯誤。附註: 與 sqlcmd 命令列公用程式 (可以處理多個輸入檔) 不同的是,ascmd 命令列公用程式每次只能處理一個輸入檔。如果您有一個以上的輸入檔,則必須分別呼叫和執行每個檔案。 以 -i 或 -Q 參數所指定的輸入檔必須是有效的 XML 結構,並且特殊字元必須是 HTML 編碼的。例如,當您在文字中使用連字號 & 時,必須將該符號編碼為
&
。例如,[Product].&[1922] 必須編碼成 [Product].&[1922]。同樣地,小於符號 (<) 必須編碼為<
,大於符號 (>) 必須編碼為>
,雙引號 (") 則必須編碼為"
。因為成員索引鍵的語法會使用連字號 & 字元,所以對 MDX 查詢和 DMX 陳述式來說這點很重要。附註: 如果輸入文字看起來不像是 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 處理序同時寫入同一個檔案;如果嘗試這樣做,檔案輸出可能會損毀或不正確。
如果指定的輸出檔是 NUL 或 NUL:filename,除非使用 –T 參數指定追蹤檔案,否則會捨棄執行結果,在這種情況下,執行結果會儲存在追蹤檔案中。指定 NUL 輸出檔搭配 -T 參數,在指定 Duration 追蹤層級搭配 -Tl 參數的時候十分實用。
例如,您可以建立一連串的 MDX 查詢並使用 ascmd 命令列公用程式執行這些查詢、忽略輸出 (可能很大)、將查詢持續時間記錄至追蹤檔案,然後將追蹤檔案中的查詢持續時間值載入資料庫。這可讓您評估經過一段時間的效能變化。或者,您可以使用 Duration-result 追蹤層級搭配 –Tl 參數,將持續時間及執行結果納入追蹤檔案。
附註: ascmd 命令列公用程式支援國際編碼。輸入及輸出檔使用已啟用位元組順序標記的 UTF-8 編碼。如果您的文字編輯器不支援 UTF-8,並且 MDX 查詢、XMLA 指令碼或 DMX 陳述式中有國際字元,可以使用 [記事本] 將輸入檔轉換成 UTF-8 格式。若要將輸入檔轉換成 UTF-8,請在 [記事本] 中開啟檔案,選取 [檔案] 功能表上的 [另存新檔],然後在 [編碼] 方塊中選取 [UTF-8]。之後,您就可以使用此檔案搭配 –i 參數。輸出及追蹤檔案 (-o 及 -T) 一律會以 UTF-8 編碼及位元組順序標記寫入,以確保保存 Unicode 字元。
-Ttrace-file
識別檔案,這個檔案會接收來自執行 XMLA 指令碼、MDX 查詢或 DMX 陳述式之 ascmd 命令列公用程式的 Analysis Services 追蹤事件。如果檔案已經存在,則會自動覆寫該檔案 (但使用 –TlDuration 及 –TlDuration-result 參數設定所建立的追蹤檔案除外)。包含空格的檔案名稱必須以引號 ("") 括住。如果檔案名稱無效,則會產生錯誤訊息並結束 ascmd 命令列公用程式。ascmd 命令列公用程式不支援多個 ascmd 處理序同時寫入同一個檔案;如果嘗試這樣做,檔案輸出可能會損毀或不正確。如果沒有指定 –T 參數,則不會擷取追蹤輸出並會忽略 –Tf、–Tl、–Td 及 –Tt 參數。
附註: 使用 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。可用的選項如下:- 如果是文字,檔案是以文字格式寫入的。格式的範例如下:
<current time> <event-class>.<event-subclass>, [name=value] - 如果是 csv,檔案是以逗號分隔格式寫入的。預設的資料行分隔符號是 | (垂直線);使用 -Td 參數變更 csv 檔案的預設分隔符號。檔案的第一行會指定值的資料行標題。
- 如果是文字,檔案是以文字格式寫入的。格式的範例如下:
- -Tddelim-char
在使用 –Tf 參數指定 csv 做為追蹤檔案格式時,指定單一字元做為追蹤檔案分隔符號。預設是 | (垂直線)。
- -Tttrace-timeout
指定 Analysis Services 引擎在結束追蹤之前等候的秒數 (如果您指定 –T 參數的話)。如果在指定的時間週期內沒有記錄追蹤訊息,追蹤會被視為已完成。預設的追蹤逾時值是 5 秒。
-Tltrace-level
指定追蹤檔中要收集和記錄的資料。這個參數有下列五個可能值:- High – 記錄所有的追蹤事件,這是預設值。
- Medium – 除了 ProgressReportCurrent 及 Notification 事件以外,記錄所有其他追蹤事件。
- Low - 只記錄事件中包含「結束」或「錯誤」的追蹤事件。
- Duration - 不記錄追蹤事件,但判斷 ascmd 處理序執行指令碼、查詢或陳述式的持續時間。在追蹤檔案中寫入單一項目,其中包括目前時間、持續時間、執行文字、資料庫及伺服器名稱。
- Duration-result – 記錄與 Duration 設定相同的資訊,並且也會在追蹤檔案的最後一個資料行中記錄執行結果。
附註: 以 Duration 及 Duration-result 設定所產生的追蹤檔案在每次執行時不會被覆寫 (以 High、Medium 及 Low 設定所產生的追蹤檔案則是每次執行時會被覆寫的狀況)。相反地,使用 Duration 及 Duration-result 設定時,如果追蹤檔案已存在,則會開啟檔案並將新值附加至檔案結尾。如果追蹤檔案不存在,則會建立一個。
-Q*"cmdline query or script"*
直接在命令列上 (而不是檔案中) 指定實際指令碼、查詢或陳述式。附註: sqlcmd 命令列公用程式支援另一個指定輸入查詢的方法 (使用 –q 參數)。不幸的是,因為該選項會讀取 sysinput,除非加入更多語言建構,否則無法寫入。例如,sqlcmd 使用 "go" 及 "exit" 控制 sysinput 命令。ascmd 命令列公用程式不支援這個指定查詢輸入的方法。
-v var=value...
指定其他指令碼變數。每個變數都是 var = 值配對。如果值包含內嵌空格或控制字元,必須以雙引號 (") 括住。例如,-v maxparallel=4 option= "degree of freedom"
您可以指定零組、一組或一組以上的 var = 值配對。
- -? 或 /?
顯示 ascmd 命令列公用程式選項的語法摘要。
金鑰加密和編譯範例
如果您尚未建立強式名稱金鑰檔,請利用下列指示產生金鑰檔。
若要產生強式名稱金鑰檔
開啟 Microsoft Visual Studio 2005 命令提示字元。按一下 [開始],依序指向 [程式集] 和 [Microsoft .NET Framework SDK 2.0],然後按一下 [SDK 命令提示字元]。
-- 或 --
開啟 Microsoft .NET Framework 命令提示字元。按一下 [開始],依序指向 [所有程式] 和 [Microsoft .NET Framework SDK 2.0],然後按一下 [SDK 命令提示字元]。
使用變更目錄命令 (CD),將命令提示字元視窗的現行目錄切換到範例的安裝資料夾。
附註: 若要判斷範例所在的資料夾,按一下 [開始] 按鈕,依序指向 [所有程式]、[Microsoft SQL Server] 和 [文件集和教學課程],然後按一下 [範例目錄]。如果是使用預設安裝位置,則範例位於 <system_drive>:\Program Files\Microsoft SQL Server\100\Samples。 在命令提示字元中,執行下列其中一個命令來產生金鑰檔:
sn -k SampleKey.snk
重要事項: 如需有關強式名稱金鑰組的詳細資訊,請參閱 MSDN 中 .NET Development Center 中的<Security Briefs: Strong Names and Security in the .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>
附註: |
---|
Microsoft x86 和 x64 電腦上完全支援 Visual Studio,Itanium 系列電腦則不支援。ascmd 命令列公用程式編譯完成後,就可以在任何 x86、x-64 或 Itanium 電腦上執行 ascmd 命令列公用程式。 |
在先前的程式碼中,32 位元電腦的 <platform> 參數值可以是 x86,x64 電腦可以是 x64,或 IA-64 電腦可以是 Itanium。最佳作法是編譯適當的 ascmd 命令列公用程式版本,因為在 64 位元電腦上執行 32 位元程式碼時,效能可能會降低。
附註: |
---|
如果您在不同於目標電腦架構的電腦上編譯 ascmd 命令列公用程式 (例如,使用 x64 或 Itanium 參數值在 32 位元電腦上編譯 ascmd 命令列公用程式),就會收到三個警告訊息,指出三個不同的系統 DLL 無法使用 (「...以不同的處理器為目標」)。這是正常且預期的情況。在您編譯 ascmd 命令列公用程式之後,將編譯過的可執行檔複製到目標伺服器,然後從目標伺服器 (有適當的 DLL 可用) 執行該檔。 |
使用指令碼和環境變數
ascmd 命令列公用程式支援系統保留和使用者自訂的指令碼變數用於 XMLA 指令碼、MDX 查詢及 DMS 陳述式。透過指定環境變數值或指定命令列參數值,可以填入這些變數的值。
下列規定適用於使用者自訂的指令碼變數和環境變數:
- 變數可以包含任何數目的小寫字元、大寫字元、數字、虛線 (-) 或底線 (_)。
- 變數不能包含內嵌字元或控制字元,例如 CR、LF、TAB。
系統保留指令碼變數
系統保留指令碼變數是 ascmd 命令列公用程式所定義的指令碼變數,用來保留與每個命令列參數關聯的值。某些狀況下,環境變數也可以用來保存這些系統保留指令碼變數的值。對於可以從環境變數及命令列參數填入或衍生的系統保留指令碼變數,指定給命令列參數的值 (如果指定的話) 會覆寫任何指定的環境變數值。
下表描述系統保留指令碼變數、關聯的命令列參數,以及 (如果適用) 關聯的環境變數。
附註: |
---|
有三個系統保留指令碼變數只能透過命令列參數設定 (–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
以上的 SET 陳述式指定 ASCMDSERVER 環境變數的值,會設定下列三個系統保留指令碼變數的下列值:
- ASCMDSERVER="http://myserver/my_virtual_dir/msmdpump.dll"
- ASCMDINSTANCE=""
- ASCMDHTTPCONNECTION="true"
下列範例會使用不同的 SET 陳述式,以不同的值填入三個相同的系統保留指令碼變數:
- C:\>SET ASCMDSERVER=myserver\myinstance
以上的 SET 陳述式指定 ASCMDSERVER 環境變數的值,會設定下列三個系統保留指令碼變數的值:
- 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 <server name> -i process.xmla -v cube=<CubeID>
process.xmla (簡化)
<Batch>
<Parallel>
<Process>
<Object>
<DatabaseID>$(ASCMDDBNAME)</DatabaseID>
<CubeID>($CUBE)</CubeID>
. . .
</Process>
</Parallel>
</Batch>
使用者自訂指令碼變數
使用者自訂指令碼變數是命令列中使用 –v 參數所定義,或定義為環境變數的指令碼變數。當 ascmd 命令列公用程式遇到 XMLA 指令碼、MDX 查詢或 DMX 陳述式中的變數,並且變數尚未由 –v 參數填入時,公用程式會檢查相同名稱的環境變數並使用該變數的值。如果 ascmd 命令列公用程式找不到相符的環境變數,則會以空字串 ("") 取代指令碼變數並將其刪除。
下列規則適用於命令列中,以 –v 參數定義的使用者自訂指令碼變數:
- 變數中「值」部分的開頭和尾端空白都會移除。
- 變數不能以字串 "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
若要同時對一個以上的物件執行命令,請使用 <Batch> 命令。若要對 MDX 查詢和 DMX 陳述式執行,請使用 <Statement> 命令。如需詳細資訊,請參閱《SQL Server 2005 線上叢書》中的<Command Element (XMLA)>。下列範例會說明如何建構 MDX 查詢、DMX 陳述式及 XMLA 指令碼。
重要事項: |
---|
如同所有的 XML 結構,命令會區分大小寫。例如,您必須以 <Statement> …</Statement> 標記括住所有 MDX 查詢,而且命令必須是 "Statement",不能是 "statement" 或 "STATEMENT"。 |
除了 XMLA 命令之外,ascmd 命令列公用程式還可以用來執行自訂 XMLA 要求,幾乎可以執行用 XMLA 表示的任何要求。例如,ascmd 命令列公用程式可以用來發出下列其中一個 XMLA 要求︰
- 探索 XMLA 要求以查詢 Analysis Services 中繼資料。此中繼資料包括有關下列項目的資訊:
- 儲存在 Analysis Services 資料庫中的物件,例如伺服器上定義的 Cube。
- 所使用的資源,例如伺服器上開啟的連接。
- 執行要求,這些要求會執行命令,但透過指定屬性清單或參數清單的方式修改命令。本文件後面提供此類要求的範例,請參閱<執行範例>。
如果輸入文字不是格式為 XMLA 命令、探索要求或執行要求,則 ascmd 命令列公用程式會假設輸入文字是 MDX 查詢或 DMX 陳述式。在此情況下,ascmd 命令列公用程式會使用 HTML 編碼文字,並用 <Statement> … </Statement> 元素包裝文字,然後將文字當做 XMLA 命令處理。這可讓您輕鬆地輸入 MDX 查詢或 DMX 陳述式。如需有關如何使用這項功能的範例,請參閱本文件後面的<狀況 1:查詢 Analysis Services Cube>:
MDX 範例:
<Statement>
SELECT NON EMPTY
[Employees].Members ON ROWS,
[Measures].[Internet Gross Profit] ON COLUMNS
FROM [Adventure Works]
</Statement>
此範例會在 XMLA 陳述式中使用 MDX 查詢,以便從 Adventure Works Cube 傳回 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 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 探索要求,以傳回 Adventure Works DW 資料庫中可用的 Cube。由於檢視方塊會如同 Cube 般傳回至應用程式,因此傳回的資料實際上會包括 Cube 和檢視方塊。
執行範例︰
<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。Multidimensional 格式為 XMLA 陳述式命令的預設值。由於傳回格式為 Tabular (資料列集) 格式,因此理解 xsd 單層化資料列集而非資料格集的應用程式便無法使用輸出檔,而且單層化資料列集可能更容易載入 SQL 關聯式資料庫,因為該資料庫現在已格式化為資料表。
ASCMD 狀況範例
下列狀況會示範 ascmd 命令列公用程式的用法。
狀況 1:查詢 Analysis Services Cube
在這個狀況中,您會建立包含 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].&[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 "&" (表示其為成員索引鍵,而非名稱) 取代為 & (視 HTML 編碼所需),並且 <Statement> 元素已指定。請注意,使用格式 2 時,不需要 HTML 編碼,也不需要 <Statement> 元素。這是因為輸入文字不是以有效的 XMLA 命令開頭,而 ascmd 命令列公用程式因此將輸入文字假設為陳述式,並且在執行之前自動使用 HTML 編碼輸入文字,然後用 <Statement> 元素包裝該文字。
狀況 2:備份不受信任網域中的資料庫
在這個狀況中,您會使用 ascmd 命令列公用程式,備份不受信任網域中的伺服器資料庫。由於資料庫位於不受信任的網域中,因此這個狀況需要 http 存取權限。在這個狀況中,遠端伺服器 (名為 "myserver") 會同時執行 Internet Information Services (IIS) 和 Analysis Services,並且具有名為 "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) 中使用指令碼變數,以指定平行處理原則的程度、資料庫和 Cube 名稱,以及處理類型。這個 XMLA 指令碼也會示範 XMLA 指令碼中的註解用法。從 ascmd 命令列公用程式呼叫 process.xmla 處理指令碼時,您會在批次檔 (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 查詢。例如,您可能在每天凌晨兩點或夜間批次載入之後使用 SQL Server Agent 呼叫這個批次檔。在批次檔中,您會設定伺服器、資料庫及 Cube 名稱的環境變數。因為指定為環境變數的伺服器和資料庫名稱完全符合系統保留指令碼變數的名稱,所以它們會變成 –S 和 –d 命令列參數的預設值。所有 MDX 查詢都可使用 Cube 名稱的使用者自訂指令碼變數。
query1.mdx 檔案:
檔案:query1.mdx 到 query6.mdx,採用 query1.txt 的格式
<Statement>
SELECT [Measures].[Internet Sales Amount] ON COLUMNS
FROM $(cube)
WHERE [Customer].[Country].&[United States]
</Statement>
將 [United States] 取代為 Adventure Works 中的其他國家 (地區)︰[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 檔案 (–oNUL)。您也可以使用 –Tl 持續時間參數,同時將執行結果記錄至追蹤記錄中。以這個方式使用 ascmd 命令列公用程式,可讓您追蹤每個 MDX 查詢所需的時間,並且可以每天比較這些結果,以確保傳回相同範圍內的值。如果特定日期的持續時間結果明顯超出範圍,則表示可能必須取消該 ETL 執行的結果。
命令列範例:
C:\>ascmd -i %queryfile% -o NUL -T querylog.csv -Tl duration
狀況 7:自動化資料採礦模型的建立和訓練
在這個狀況中,您會使用 ascmd 命令列公用程式呼叫一連串的 DMX 陳述式,如下所示︰
- 建立採礦結構 (Bike Buyer Structure.DMX) 以及使用環境變數設定伺服器和資料庫名稱的 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"
處理採礦結構和採礦模型
Process 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 檔案包含資料庫和 Cube 名稱的指令碼變數。這個 XMLA 指令碼是由批次檔 (ClearCache.bat) 呼叫的,這個批次檔會指定伺服器和執行個體名稱、資料庫名稱、輸入檔名稱、輸出檔名稱及 Cube 名稱。
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 命令列公用程式將回寫切割成兩部分:更改資料,然後認可資料。由於回寫作業必須在同一筆交易中依次發出兩個 MDX 陳述式 (Update Cube 和 Commit Transaction 陳述式),回寫需要使用 GO 命令。MDX 不支援在同一批次中發出這兩個陳述式。
針對這個狀況,您必須修改 Adventure Works DW 資料庫使其支援回寫。現有的資料庫目前並無任何 Cube 範例支援回寫。若要建立 Cube 以確認支援回寫,請執行下列步驟:
定義新的 Cube 名為 "Writeback"
開啟 Business Intelligence Development Studio。
指向 [檔案] 功能表上的 [開啟],再按一下 [Analysis Services 資料庫]。
在 [連接到資料庫] 對話方塊的 [伺服器] 文字方塊中輸入您的伺服器名稱,再從 [資料庫] 清單中選取 [Adventure Works DW] 資料庫,然後按一下 [確定]。
在 [方案總管] 中,以滑鼠右鍵按一下 [Cube],再按一下 [新增 Cube]。
在 Cube 精靈的 [歡迎使用 Cube 精靈] 頁面上按 [下一步],再選取 [使用資料來源建立 Cube] 並清除 [自動建立] 核取方塊,然後按 [下一步]。
在 [選取資料來源檢視] 頁面上,從 [可用的資料來源檢視] 清單中選取 [Adventure Works DW],然後按 [下一步]。
在 [識別事實和維度資料表] 頁面上,針對 FactSalesQuota 資料表選取 [事實] 核取方塊,並針對 dbo.DimTime 和 dbo.DimEmployee 資料表選取 [維度] 核取方塊,然後按 [下一步]。
dbo.DimTime (維度名為 Date) dbo.DimEmployeeFactSalesQuota (僅使用 [銷售量配額] 量值)
在 [檢閱共用維度] 頁面上,從 [可用的維度] 清單中選取 [Date] 和 [Employee],再按一下 [>] 將這些維度新增至 [Cube 維度] 清單中,然後按 [下一步]。
在 [選取量值] 頁面上,清除 [事實銷售配額] 核取方塊並選取 [銷售量配額] 核取方塊,然後按 [下一步]。
在 [正在完成精靈] 頁面上,將 Cube 名稱變更為 Writeback,然後按一下 [完成]。
為 [事實銷售配額] 量值群組啟用回寫
選取 Cube 設計師的 [資料分割] 索引標籤。
以滑鼠右鍵按一下資料分割清單中的 [事實銷售配額] 資料分割,再按一下 [回寫設定]。
檢閱 [啟用回寫 - 事實銷售配額] 對話方塊中預設的回寫資料表名稱,再按一下 [確定] 以建立該資料表,並為現行資料分割啟用回寫。
請注意如今已出現兩個資料分割,分別代表事實資料表和回寫資料表。
處理 Writeback Cube
在 [方案總管] 中,以滑鼠右鍵按一下 [Cube] 節點下的 [Writeback],然後按一下 [處理]。
提示您儲存變更時,按一下 [是]。
在 [處理 Cube - Writeback] 對話方塊中,按一下 [執行]。
若您展開處理命令,將會看到現正使用 CREATE TABLE SQL 陳述式建立回寫關聯式資料表。
待處理完成時,確認 [狀態] 方塊顯示處理成功,然後按一下 [關閉]。
再按一次 [關閉],關閉 [處理資料分割 - WriteTable_事實銷售配額] 對話方塊。
關閉 Business Intelligence Development Studio。
確認回寫可正常運作
開啟 SQL Server Management Studio。
連接到伺服器,然後展開 [物件總管] 中的 [資料庫],再以滑鼠右鍵按一下 [Adventure Works DW] 並指向 [新增查詢],然後按一下 [MDX]。
在 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])
發出下列 MDX 陳述式,將資料格修改為傳回 $2,200:
UPDATE CUBE [Writeback] SET ([Employee].[Employee].[Stephen Y. Jiang], [Date].[Calendar].[Calendar Quarter].[Q1 CY 2002]) = 2200
執行下列 MDX 陳述式以認可交易:
COMMIT TRANSACTION
此時,您可以檢查 Adventure Works DW 關聯式資料庫中的「dbo.WriteTable_事實銷售配額」資料表,瞭解回寫對資料格做了哪些實質變更。如果您這樣做,會發現其實是將差異 (-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 日 |
|
請參閱
其他資源
XML for Analysis (XMLA)
XML for Analysis Reference (XMLA)
Discover Method (XMLA)
Execute Method (XMLA)