搭配特定資料來源使用查詢參數 (Reporting Services)
當您定義資料集的查詢時,您會選擇資料來源類型。 資料來源類型會指定用來連接該資料來源的資料處理延伸模組或已註冊的 .NET Framework 資料提供者。 資料提供者是與資料來源互動的軟體層,它也會判斷該處的哪一項支援是為了使用查詢中的變數。 本主題會示範給定結果集的查詢會如何根據您連接的資料來源而變更,以及該結果集是否包含查詢中的變數。
查詢變數和資料提供者
下表顯示 AdventureWorks 範例資料庫中的資料結果。 您可以建立這個結果集,方法是針對 AdventureWorks 範例資料庫執行 Transact-SQL 查詢,或是針對部署為 AdventureWorks 範例報表一部分的 Adventure Works Cube 來執行 MDX 查詢。 此結果集會顯示兩個資料行:包含 "Mountain" 一字的產品型號名稱以及對應的網際網路銷售量。
名稱 |
InternetSales |
---|---|
Fender Set - Mountain |
2121 |
HL Mountain Tire |
1396 |
LL Mountain Tire |
862 |
ML Mountain Tire |
1161 |
Mountain Bottle Cage |
2025 |
Mountain Tire Tube |
3095 |
Mountain-100 |
396 |
Mountain-200 |
3552 |
Mountain-400-W |
543 |
Mountain-500 |
479 |
Women's Mountain Shorts |
1019 |
在以下章節中,您將會看到用來建立此結果集的查詢,首先會從關聯式資料庫發出查詢,然後會從多維度資料庫發出查詢。
關聯式資料庫資料來源
如果是類似 MicrosoftSQL Server 的關聯式資料庫,您可以使用 Transact-SQL 建立查詢。 雖然這類查詢會加入 WHERE 子句 (此子句會設為寫入程式碼的值) 來限制結果,但是這類查詢未包含任何變數。
Transact-SQL 查詢 |
---|
SELECT PM.Name, Count(*) as InternetSales FROM Sales.SalesOrderHeader SOH INNER JOIN Sales.SalesOrderDetail SOD ON SOH.SalesOrderID = SOD.SalesOrderID INNER JOIN Production.Product PP ON SOD.ProductID = PP.ProductID INNER JOIN Production.ProductModel PM ON PP.ProductModelId = PM.ProductModelID WHERE (SOH.OnLineOrderFlag = 1 AND PM.Name LIKE ('%Mountain%')) GROUP BY PM.Name ORDER BY PM.Name |
若要加入產品型號名稱 PM.Name 的變數,您需要在 WHERE 子句中指定查詢參數。 下表會示範如何針對不同的資料提供者來指定查詢參數。 當您選擇資料來源類型時,會自動為您選取資料提供者; 此資料提供者的連接字串會顯示在第二個資料行中。 此表格中的查詢相當於上面的查詢,但是增加了資料提供者支援之格式的參數。
資料來源類型 |
資料提供者 |
查詢 |
---|---|---|
MicrosoftSQL Server |
MicrosoftSQL Server (SqlClient) 連接字串: Data Source=.;Initial Catalog=AdventureWorks |
SELECT PM.Name, Count(*) FROM Sales.SalesOrderHeader SOH INNER JOIN Sales.SalesOrderDetail SOD ON SOH.SalesOrderID = SOD.SalesOrderID INNER JOIN Production.Product PP ON SOD.ProductID = PP.ProductID INNER JOIN Production.ProductModel PM ON PP.ProductModelId = PM.ProductModelID WHERE (SOH.OnLineOrderFlag = 1 AND (PM.Name LIKE '%' + @Mountain + '%')) GROUP BY PM.Name ORDER BY PM.Name |
OLE DB |
Microsoft OLE DB Provider for SQL Server 連接字串: Provider=SQLOLEDB.1;Data Source=.;Initial Catalog=AdventureWorks |
SELECT PM.Name, Count(*) FROM Sales.SalesOrderHeader SOH INNER JOIN Sales.SalesOrderDetail SOD ON SOH.SalesOrderID = SOD.SalesOrderID INNER JOIN Production.Product PP ON SOD.ProductID = PP.ProductID INNER JOIN Production.ProductModel PM ON PP.ProductModelId = PM.ProductModelID WHERE ((SOH.OnLineOrderFlag = 1) AND PM.Name LIKE ('%' + ? + '%')) GROUP BY PM.Name ORDER BY PM.Name |
Oracle |
MicrosoftSQL Server (OracleClient) |
SELECT PM.Name, Count(*) FROM Sales.SalesOrderHeader SOH INNER JOIN Sales.SalesOrderDetail SOD ON SOH.SalesOrderID = SOD.SalesOrderID INNER JOIN Production.Product PP ON SOD.ProductID = PP.ProductID INNER JOIN Production.ProductModel PM ON PP.ProductModelId = PM.ProductModelID WHERE ((SOH.OnLineOrderFlag = 1) AND PM.Name LIKE '%' + :1 + '%') GROUP BY PM.Name ORDER BY PM.Name |
OLE DB |
任何已註冊的 .NET Framework Data Provider |
視提供者而定。 |
在這些範例中,已將一個變數加入到查詢的 WHERE 子句,讓 "Mountain" 一字的測試變更為變數值的測試。
.NET Data Provider for SQL Server 支援以 @ 字元當做開頭的具名變數。 例如,PM.Name LIKE '%' + @Mountain + '%')。
OLE DB Provider for SQL Server 不支援具名變數, 請使用問號 (?) 字元來指定變數。 傳遞給 OLE DB Provider 的參數必須根據 WHERE 子句中出現的順序來傳遞。 例如,PM.Name LIKE ('%' + ? + '%')。
.NET Data Provider for Oracle 支援以冒號 (:) 字元當做開頭的數字參數。 例如,PM.Name LIKE '%' + :1 + '%')。
其他 OLE DB Data Provider 對變數的支援需視資料提供者而定。 如需詳細資訊,請查閱資料提供者的相關文件集。
與資料來源類型有關的查詢設計工具會針對每一個識別的變數建立查詢參數, 這些查詢參數會列在 [資料集] 屬性頁面的 [參數] 索引標籤上。 每一個查詢參數都會建立「字串」類型的報表參數, 為資料集定義的查詢參數值會設定為對應的報表參數。 您可以在 [報表屬性] 對話方塊中編輯報表參數資料類型及其他屬性,此對話方塊可從 [資料] 檢視的 [報表] 功能表中存取。 您也可以手動建立、編輯或刪除這些查詢參數。 如需詳細資訊,請參閱<資料集屬性對話方塊、參數>。
多維度資料庫資料來源
如果是類似 Analysis Services 的多維度資料庫,您可以使用 MDX 建立查詢。 雖然這類查詢會加入 Filter 子句 (此子句會設為寫入程式碼的值) 來限制結果,但是這類查詢未包含任何變數。
MDX 查詢 |
---|
SELECT NON EMPTY { [Measures].[Internet Order Count] } ON COLUMNS, NON EMPTY { ([Product].[Model Name].[Model Name].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM ( SELECT ( Filter( [Product].[Model Name].[Model Name].ALLMEMBERS, Instr([Product].[Model Name].currentmember.Properties( 'Member_Caption' ), 'Mountain' ) > 0 ) ) ON COLUMNS FROM [Adventure Works]) CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS |
若要加入產品型號名稱 @ProductModelName 的變數,您需要加入 FILTER 子句。 下表顯示多維度資料庫的變數為 FILTER 子句的一部分。 資料來源類型就是當您為 Reporting Services 建立新的資料來源時,從下拉式清單中選擇的值。 當您選擇資料來源類型時,會自動為您選取資料提供者; 此資料提供者的連接字串也會顯示在第二個資料行中。 此表格中的查詢相當於上面的查詢,但是增加了資料提供者支援之格式的參數。
資料來源類型 |
資料提供者 |
查詢 |
---|---|---|
MicrosoftSQL ServerAnalysis Services |
SQL ServerAnalysis Services (AdomdClient) 連接字串: Data Source=.;Initial Catalog="Adventure Works DW" |
SELECT NON EMPTY { [Measures].[Internet Order Count] } ON COLUMNS, NON EMPTY { ([Product].[Model Name].[Model Name].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM ( SELECT ( Filter( [Product].[Model Name].[Model Name].ALLMEMBERS, Instr( [Product].[Model Name].currentmember.Properties( 'Member_Caption' ), @ProductModelName ) > 0 ) ) ON COLUMNS FROM [Adventure Works]) CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS |
OLE DB |
Microsoft OLE DB Provider for Analysis Services 9.0 連接字串: Provider=MSOLAP.3;Data Source=.;Initial Catalog="Adventure Works DW" |
OLE DB for OLAP 不支援參數化查詢。 以下白皮書中有描述因應措施:<將 Analysis Services 與 Reporting Services 整合>(英文)。 |
在這些範例中,已將一個變數加入到查詢的 WHERE 子句,讓 Mountain 一字的測試變更為變數值的測試。
MicrosoftSQL ServerAnalysis Services 支援 MDX 查詢設計工具中 [篩選] 區段內定義的具名參數。 具名變數是以 @ 字元當做開頭, 例如,@ProductModelName。
Microsoft OLE DB Provider for Analysis Services 9.0 不支援參數化查詢。 如需詳細資訊,請在 msdn.microsoft.com 上搜尋<將 Analysis Services 與 Reporting Services 整合>(英文)。
其他多維度資料提供者對變數的支援需視資料提供者而定。 如需詳細資訊,請查閱資料提供者的相關文件集。
與資料來源類型有關的查詢設計工具會針對每一個識別的變數建立查詢參數, 會自動建立特殊資料集,以便為每一個參數提供有效的值, 這些查詢參數會列在 [資料集] 屬性頁面的 [參數] 索引標籤上。 每一個查詢參數都會建立「字串」類型的報表參數, 為資料集定義的查詢參數值會設定為對應的報表參數。 您也可以手動建立、編輯或刪除這些資料集參數。 如需詳細資訊,請參閱<如何:在 Analysis Services 的 MDX 查詢設計工具中定義參數>。
在處理每個查詢時,都會建立資料集來提供該查詢的有效值。