【发布时间】:2011-09-03 07:46:22
【问题描述】:
我有一些用 C# 编写的复杂算法作为 CLR 存储过程。程序不是确定性的(取决于当前时间)。过程的结果是两个表。 我没有找到任何解决方案如何处理 T-SQL 中存储过程的多结果。这个过程的性能是关键(过程每约 2 秒调用一次)。
我发现更新表格最快的方法是:
UPDATE [db-table] SET ... SELECT * FROM [clr-func]
这比通过 ADO.NET 从 CLR 过程更新 db-table 快得多。
我使用静态字段存储结果,并在clr存储过程执行后查询。
调用栈是:
T-SQL proc
-> CLR proc (MyStoredProcedure)
-> T-SQL proc (UpdateDataFromMyStoredProcedure)
-> CLR func (GetFirstResultOfMyStoredProcedure)
-> CLR func (GetSecondResultOfMyStoredProcedure)
问题是,有时 CLR 函数在静态字段 result 中有 null,但在 CLR 过程中 result 不是 null。我发现,有时 CLR 函数在另一个 AppDomain 中调用,而不是 CLR 过程。但是 CLR 程序仍在运行,可以进行下一步操作,并且没有抛出异常。
有什么办法,如何强制在与“父”CLR 过程相同的 AppDomain 中调用 CLR 函数?
或者还有其他方法,如何实现我的意图?
P.S.:最初复杂的算法是用 T-SQL 编写的,但性能很差(比 C# 中的算法慢约 100 倍)。
谢谢!
简化代码:
// T-SQL
CREATE PROC [dbo].[UpdateDataFromMyStoredProcedure] AS BEGIN
UPDATE [dbo].[tblObject]
SET ...
SELECT * FROM [dbo].[GetFirstResultOfMyStoredProcedure]()
UPDATE [dbo].[tblObjectAction]
SET ...
SELECT * FROM [dbo].[GetSecondResultOfMyStoredProcedure]()
END
// ... somewhere else
EXEC [dbo].[MyStoredProcedure]
-
// C#
public class StoredProcedures {
// store for result of "MyStoredProcedure ()"
private static MyStoredProcedureResult result;
[SqlProcedure]
public static int MyStoredProcedure() {
result = null;
result = ComputeComplexAlgorithm();
UpdateDataFromMyStoredProcedure();
result = null;
}
[SqlFunction(...)]
public static IEnumerable GetFirstResultOfMyStoredProcedure() {
return result.First;
}
[SqlFunction(...)]
public static IEnumerable GetSecondResultOfMyStoredProcedure() {
return result.Second;
}
private static void UpdateDataFromMyStoredProcedure() {
using(var cnn = new SqlConnection("context connection=true")) {
using(var cmd = cnn.CreateCommand()) {
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "[dbo].[UpdateDataFromMyStoredProcedure]";
cmd.ExecuteNonQuery();
}
}
}
}
【问题讨论】:
-
也许在 CLR 中实现 [dbo].[UpdateDataFromMyStoredProcedure] 也有意义?
-
@Piotr Rodak:对于从 CLR proc 更新 db-table 我只知道一种方法:使用 SqlCommand 并为每条记录调用更新。与经典的 T-SQL UPDATE 相比,它非常慢 - 我需要非常快速地处理它:(。
标签: c# sql-server performance stored-procedures sqlclr