我想编写一个C#应用程序来检查所选存储过程的某些条件。例如,如果存储过程包含5个选择查询,则同一查询必须包含5 with(nolock)
(选择临时表除外)。
我怎样才能通过C#来做到这一点?提前谢谢。
答案 0 :(得分: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 server,因为我将源代码保留在版本控制之外,因此Visual Studio插件将是更好的解决方案。
答案 1 :(得分:1)
您可以使用sys.objects
查询SQL Server的元数据,以便像文本一样分析SP的定义。在您的情况下,您可以创建下面列出的查询,并从C#app检查其结果:
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'