gpt4 book ai didi

c# - 在T-SQL中处理CLR存储过程的多个结果

转载 作者:太空狗 更新时间:2023-10-30 01:25:50 27 4
gpt4 key购买 nike

我有一些复杂的算法是用c作为clr存储过程编写的。过程不是确定性的(它取决于当前时间)。程序的结果是两个表。
我没有找到任何解决方案来处理t-sql中存储过程的多个结果。此过程的性能是关键(过程每~2秒调用一次)。
我发现更新表的最快方法是:

UPDATE [db-table] SET ... SELECT * FROM [clr-func]

它比通过ADO.NET从CLR过程更新DB表快得多。
我使用静态字段来存储结果,并在执行clr存储过程后对其进行查询。
调用堆栈是:
T-SQL proc
-> CLR proc (MyStoredProcedure)
-> T-SQL proc (UpdateDataFromMyStoredProcedure)
-> CLR func (GetFirstResultOfMyStoredProcedure)
-> CLR func (GetSecondResultOfMyStoredProcedure)

问题是,有时clr函数在静态字段中有空值,但在clr过程中是不空的。我发现,有时候clr函数在另一个appdomain中调用,而不是在clr过程中调用。不过,CLR过程仍在运行,可以执行下一个操作,并且不会引发异常。
有没有办法,如何强制CLR函数与“父”CLR过程在同一个Appdomain中调用?
还是有别的办法,如何达到我的目的?
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();
}
}
}
}

最佳答案

根据Bob Beauchemin“sqlclr为每个程序集所有者创建一个appdomain,而不是为每个数据库创建一个appdomain”
两个sqlclr程序集是否具有相同的所有者?

关于c# - 在T-SQL中处理CLR存储过程的多个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6151289/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com