我希望编写一个C#应用程序,以检查所选的存储过程是否符合某些标准。例如,如果存储过程包含5个select查询,则相同的查询必须包含5个with(nolock)
(除了临时表的select)。
如何通过C#实现这一点?提前谢谢。
我希望编写一个C#应用程序,以检查所选的存储过程是否符合某些标准。例如,如果存储过程包含5个select查询,则相同的查询必须包含5个with(nolock)
(除了临时表的select)。
如何通过C#实现这一点?提前谢谢。
不确定问题是什么。
显然需要解析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]);;
}
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'
或者
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'
NOLOCK
的内容,了解它的优缺点,它所做的“魔法”以及为什么在大多数情况下使用它是没有意义的。 - Ivan Starostin