逐步解說:分析現有資料庫的 Transact-SQL 程式碼
您可以將資料庫「結構描述」(Schema) 中的 Transact-SQL 程式碼,匯入至「資料庫專案」(Database Project),然後針對一組規則分析程式碼,以改善程式碼的品質。 例如,您可以在必須使用但尚未開發,且品質尚未經驗證的結構描述中尋找錯誤。 如需詳細資訊,請參閱分析資料庫程式碼以改善程式碼品質。
在您可以分析資料庫程式碼前,必須先將現有資料庫的「結構描述」(Schema) 匯入至「資料庫專案」(Database Project)。 該專案包含品質等級不明的程式碼。 您可以分析 Transact-SQL 程式碼,套用靜態程式碼分析的所有可用規則。 稍後您可能決定關閉小組的部分規則,但是這次初始評估,您要找出資料庫程式碼中所有潛在的問題。 請檢視警告,以及造成這些警告的程式碼。 您可以修正一個警告、隱藏更多警告,然後分析資料庫專案。
必要條件
在完成這個逐步解說前,您必須先完成逐步解說:將現有資料庫結構描述放入版本控制下。 在該逐步解說中,您會建立一個方案,其中包含名稱為 MyAdvWorks 的資料庫專案。
若要設定規則以分析資料庫專案
在 Visual Studio 中開啟 MyAdvWorks 方案。
在 [結構描述檢視] 中展開資料庫專案的節點 (如果尚未展開)。
指向 [資料] 功能表上的 [靜態程式碼分析],然後按一下 [設定]。
資料庫專案的程式碼分析屬性隨即出現。
在 [規則] 清單中,展開 [設計]、[命名] 及 [效能] 節點,以顯示可用來分析 Transact-SQL 程式碼的所有規則。
確認所有規則的核取方塊都已選取。
您可以選取或清除規則分類的核取方塊,例如 [設計],以選取或清除該分類中每個規則的核取方塊。
注意事項 您可以選取該項規則的 [將警告視為錯誤] 核取方塊,將規則視為錯誤而不要視為警告。
在 [檔案] 功能表上按一下 [全部儲存]。
接著,您將分析資料庫專案中的 Transact-SQL 程式碼。 在這個逐步解說中,您將開始手動進行分析,但是您可以設定為在每次成功建置資料庫專案後開始。 如需詳細資訊,請參閱 HOW TO:啟用和停用資料庫程式碼的靜態分析。
若要分析資料庫專案
指向 [資料] 功能表上的 [靜態程式碼分析],然後按一下 [執行]。
資料庫專案中的 Transact-SQL 程式碼已經過分析,並且警告會顯示在 [錯誤清單] 中。 如果沒有顯示 [錯誤清單],請開啟 [檢視] 功能表,然後按一下 [錯誤清單] 中。
接下來,您要檢視並修正其中一個警告。
若要檢視並修正警告
在 [錯誤清單] 中,找出下列警告:
SR0014 : Microsoft.Rules.Data: 從 ASCII String(1) 轉型為 SmallInt 時,可能會發生資料遺失。
導致這個警告的程式碼,在名稱為 "ufnGetStock.function.sql" 的檔案中。 您可以在行 12、資料行 30 中找到程式碼。
以滑鼠右鍵按一下 [錯誤清單] 中的警告,然後按一下 [顯示錯誤說明]。
規則 SR0014 的 [說明] 主題便會顯示。 您會知道是什麼觸發了規則、如何解決警告,以及何時要忽略警告。 您也可以看到可能導致這個警告的範例 Transact-SQL 程式碼,以及可解決警告之該程式碼的更新。
在 [錯誤清單] 中,按兩下警告或將警告反白顯示,然後按 ENTER。
Transact-SQL 編輯器隨即開啟,並且顯示引發警告的程式碼。 游標會出現在造成警告的程式碼起始處。 在這個情況下,游標會出現在 FROM 子句中,因為整數資料行 LocationID 是與單一字元常數 '6' 進行比較。 顯示以下程式碼:
CREATE FUNCTION [dbo].[ufnGetStock](@ProductID [int]) RETURNS [int] AS -- Returns the stock level for the product. This function is used internally only BEGIN DECLARE @ret int; SELECT @ret = SUM(p.[Quantity]) FROM [Production].[ProductInventory] p WHERE p.[ProductID] = @ProductID AND p.[LocationID] = '6'; -- Only look at inventory in the misc storage IF (@ret IS NULL) SET @ret = 0 RETURN @ret END; GO EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'Scalar function returning the quantity of inventory in LocationID 6 (Miscellaneous Storage)for a specified ProductID.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'FUNCTION', @level1name = N'ufnGetStock'; GO EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'Input parameter for the scalar function ufnGetStock. Enter a valid ProductID from the Production.ProductInventory table.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'FUNCTION', @level1name = N'ufnGetStock', @level2type = N'PARAMETER', @level2name = N'@ProductID';
更新 SELECT 陳述式的程式碼,以符合下列範例:
SELECT @ret = SUM(p.[Quantity]) FROM [Production].[ProductInventory] p WHERE p.[ProductID] = @ProductID AND p.[LocationID] = 6; -- Only look at inventory in the misc storage
按一下 [檔案] 功能表上的 [儲存 ufnGetStock.function.sql]。
接下來,您將檢閱並隱藏第二個警告。
若要檢視並隱藏程式碼分析警告
在 [錯誤清單] 中,找出下列警告:
SR0011 : Microsoft.Rules.Data: Object name(Database Version) contains special characters.
導致這個警告的程式碼,在名稱為 "AWBuildVersion.table.sql" 的檔案中。 您可以在行 3、資料行 5 中找到程式碼。
此時,您必須決定是否要移除物件名稱中的特殊字元。 您可以使用「資料庫重構」(Database Refactoring) 自動化更新這個物件的所有參考,以包含正確的名稱。 但是,您會破壞依賴舊名稱的任何應用程式。 如果您沒有足夠的資訊以決定最好的方法,可以隱藏警告直到您研究過變更的細節為止。 您也可以在 Visual Studio Team Foundation Server 中建立工作項目,以追蹤這個工作,或甚至指派給其他人。
在 [錯誤清單] 中,按一下 [描述] 資料行的標題。
[錯誤清單] 會依據描述來排序警告,將所有 SR0011 警告群組在一起。
捲動 [錯誤清單] 直到顯示 SR0011 警告為止,然後將該警告反白顯示。
如果您要忽略多個警告,可以按一下連續的警告清單中的第一個警告,然後按 SHIFT 鍵再按清單中的最後一個警告,以反白顯示該清單。
注意事項 您可以以滑鼠右鍵按一下任何反白顯示的資料列,指向 [建立工作項目],然後按一下工作項目的類型,以便從這個清單建立工作項目。 如果您隱藏警告直到可以變更名稱,應該在工作項目中包含一個指示,在名稱變更後取消隱藏警告。 為了讓這個逐步解說更簡短,您可以略過建立工作項目這個步驟。
以滑鼠右鍵按一下任何反白顯示的資料列,然後按一下 [隱藏靜態程式碼分析訊息]。
名稱為 StaticCodeAnalysis.SuppressMessages.xml 的檔案會加入至您的資料庫專案中。 MyAdvWorks.dbproj 檔案會從版本控制簽出。 隱藏的警告會從 [錯誤清單] 中消失,清單中只剩下少數警告。
注意事項 如果您要隱藏資料庫專案中某個檔案的警告,請隱藏該檔案之警告的所有執行個體。
XML 檔案包含隱藏之警告的清單。 如果您要取消隱藏所有被隱藏的警告,可以刪除該檔案。 如需詳細資訊,請參閱 HOW TO:停止資料庫程式碼分析的隱藏警告。
在最後的程序中,您將重新分析資料庫專案。
若要重新分析資料庫專案
指向 [資料] 功能表上的 [靜態程式碼分析],然後按一下 [執行]。
資料庫專案中的 Transact-SQL 程式碼隨即經過再次分析,而其餘警告會出現在 [錯誤清單] 中。 沒有顯示您已修正或隱藏的警告。
後續步驟
在一個典型的環境中,您可能會分析 [錯誤清單] 中顯示的每一個警告。 接著,修正可以立即修正的問題、隱藏可以忽略的問題,然後為稍後必須修正的問題建立工作項目。 針對某些問題,您可以使用資料庫重構來解決警告。 如需資料庫重構的詳細資訊,請參閱重構資料庫程式碼和資料。
解決或隱藏每個警告之後,您應該執行「資料庫單元測試」(Database Unit Test) 及應用程式測試,以確認變更沒有造成問題。 如需資料庫單元測試的詳細資訊,請參閱使用單元測試驗證資料庫程式碼。