SQL Server 检查存储过程是否包含 WITH(NOLOCK)

本文关键字:WITH NOLOCK 包含 是否 Server 检查 存储过程 SQL | 更新日期: 2023-09-27 18:36:38

我想编写一个 C# 应用程序来检查所选存储过程的某些条件。例如,如果存储过程包含 5 个选择查询,则同一查询必须包含 5 个with(nolock)(为临时表选择除外)。

如何通过 C# 执行此操作?提前谢谢。

SQL Server 检查存储过程是否包含 WITH(NOLOCK)

您可以使用

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'

不确定问题是什么。

你显然需要解析 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插件将是更好的解决方案。