2016-02-29 80 views
2

我想寫一個C#應用程序,查看所選的存儲過程的一些條件包含。例如,如果存儲過程包含5個select查詢,則相同的查詢必須包含5個with(nolock)(選擇temp表除外)。SQL Server的檢查,如果存儲過程(NOLOCK)

如何通過C#這樣做嗎?提前致謝。

+3

我不知道爲什麼你正在尋找nolocks提示,但我可以告訴你讀它,因爲NOLOCK是也許在TSQL – jean

+1

最被濫用的功能,您最好閱讀一些關於鎖和'NOLOCK',它的優點和缺點,有什麼「魔力」它爲什麼在大多數情況下,它的用法是毫無意義的。 –

+0

我認爲這是一個有效的問題。我同意使用NOLOCK不是一個好主意,但它只是一個例子。根據問題@ user2979085想要根據許多標準驗證存儲過程,並且他想用C#來完成。這些都是非常具體的要求。現在我猜測,但是這可能需要在構建過程中驗證代碼。 –

回答

1

您可以使用sys.objects查詢SQL Server的元數據,以分析如文本SP的定義。你的情況,你可以創建查詢這樣的下面列出,並檢查從C#應用程序及其結果:

SELECT object_definition(object_id) as [sp definition] 
, schema_name(schema_id) [schema] 
, name 
, type_desc 
FROM sys.objects 
where object_definition(object_id) like '%select%select%select%' 
and type_desc = 'SQL_STORED_PROCEDURE' 

OR

SELECT object_definition(object_id) as [sp definition] 
, schema_name(schema_id) [schema] 
, name 
, type_desc 
FROM sys.objects 
where object_definition(object_id) like '%NOLOCK%' 
and type_desc = 'SQL_STORED_PROCEDURE' 
1

不知道問題是什麼。

你顯然需要解析SQL(因爲NOLOCK也可以在註釋)。

並獲得存儲過程的來源 - 好,使用類似

using (SqlConnection sqlConnection = new SqlConnection()) 
{ 
    sqlConnection.ConnectionString = yourConnectionStringHere; 
    sqlConnection.Open(); 
    SqlCommand sqlCommand = new SqlCommand("sys.sp_helptext", sqlConnection); 
    sqlCommand.CommandType = CommandType.StoredProcedure; 
    sqlCommand.Parameters.AddWithValue("@objname", "stored_proc_name_here"); 
    DataSet ds = new DataSet(); 
    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); 
    sqlDataAdapter.SelectCommand = sqlCommand; 
    sqlDataAdapter.Fill(ds); 
    return DataTableToString(ds.Tables[0]);; 
} 

雖然我絕不會碰的SQL服務器,因爲我外面保持源在版本控制,所以一個Visual Studio插件會是更好的解決方案。