我想写一个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#来完成。这些都是非常具体的要求。现在我猜测,但是这可能需要在构建过程中验证代码。 –