2010-09-18 106 views
6

有誰知道驗證數據庫中所有存儲過程中查詢的正確性的方法嗎? 我在想如果你在代碼文件中修改某些東西的場景,只是做一個重建會顯示你編譯錯誤,指向你需要修復的地方。在數據庫場景中,假設您修改表並刪除存儲過程中使用的列,則只有在第一次運行該過程時纔會知道有關此問題的任何信息。解析數據庫中的所有存儲過程

+0

的可能重複(HTTP [我如何以編程方式檢查(解析)一個TSQL語句的有效性?]://計算器。 com/questions/3084387/how-can-i-program-check-parse-the-validity-of-a-tsql-statement)@Cyber​​Dude - 你可以使用'SET NOEXEC ON',但我認爲最好的方法是寫一個實用程序來實際嘗試並執行它們並回滾。 – 2010-09-18 18:25:24

+0

我想我可以建立一個動態腳本,列出所有程序並嘗試執行它們。一個有趣的部分是嘲笑所有必需的參數,但......另一種方法是檢索過程文本並嘗試執行「ALTER PROCEDURE」,但不會更改任何內部的任何內容。 – CyberDude 2010-09-18 18:37:43

+0

解析是有用的第一步,您可以解析修改後的存儲過程以驗證其語法。但是將它們加載到數據庫中就可以做到這一點,所以這沒有什麼好處。通過一些常規方法驗證它們的工作似乎更有用。 OMG Ponies提供的「單元測試」答案相當不錯。 – 2010-09-19 04:44:17

回答

4

你所描述的是單元測試的目的。存儲過程和函數通常需要設置參數,並且如果存儲過程或函數封裝了動態SQL,則有可能錯過了[corner]情況。

此外,你所提到的只是檢查基本錯誤 - 沒有任何關於驗證返回的數據。例如 - 我可以更改數字列的精度...

這也進入了對於直接問題應該發生的基本測試,以及迴歸測試以確保沒有不可預見的問題。

1

您可以使用SCHEMABINDING創建所有對象,這會阻止您更改任何基礎表而不刪除並重新創建構建於其上的視圖和過程。

根據您的開發過程,這可能會非常麻煩。儘管我提供它作爲解決方案,因爲如果你想確保數據庫中所有過程的正確性,這將做到這一點。

0

我在MSDN(SQL Server 2012)上找到了這個例子。我想這可以在某些情況下使用:

USE AdventureWorks2012; 
GO 

SELECT p.name, r.* 
FROM sys.procedures AS p 
CROSS APPLY sys.dm_exec_describe_first_result_set_for_object(p.object_id, 0) AS r; 

來源:sys.dm_exec_describe_first_result_set_for_object

相關問題