我想寫一個C#應用程序,查看所選的存儲過程的一些條件包含。例如,如果存儲過程包含5個select查詢,則相同的查詢必須包含5個with(nolock)
(選擇temp表除外)。SQL Server的檢查,如果存儲過程(NOLOCK)
如何通過C#這樣做嗎?提前致謝。
我想寫一個C#應用程序,查看所選的存儲過程的一些條件包含。例如,如果存儲過程包含5個select查詢,則相同的查詢必須包含5個with(nolock)
(選擇temp表除外)。SQL Server的檢查,如果存儲過程(NOLOCK)
如何通過C#這樣做嗎?提前致謝。
您可以使用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'
不知道問題是什麼。
你顯然需要解析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插件會是更好的解決方案。
我不知道爲什麼你正在尋找nolocks提示,但我可以告訴你讀它,因爲NOLOCK是也許在TSQL – jean
最被濫用的功能,您最好閱讀一些關於鎖和'NOLOCK',它的優點和缺點,有什麼「魔力」它爲什麼在大多數情況下,它的用法是毫無意義的。 –
我認爲這是一個有效的問題。我同意使用NOLOCK不是一個好主意,但它只是一個例子。根據問題@ user2979085想要根據許多標準驗證存儲過程,並且他想用C#來完成。這些都是非常具體的要求。現在我猜測,但是這可能需要在構建過程中驗證代碼。 –