Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLCLR中的验证功能及其性能_C#_.net_Sql Server 2008 R2_Sqlclr - Fatal编程技术网

C# SQLCLR中的验证功能及其性能

C# SQLCLR中的验证功能及其性能,c#,.net,sql-server-2008-r2,sqlclr,C#,.net,Sql Server 2008 R2,Sqlclr,我必须在插入新行后立即验证表中的所有数据行 详细信息:插入到表中的每一行都应通过一组验证规则,这些规则可能因行内的数据而异。 用c编写时,它看起来像一个小应用程序。因此,我不打算将其作为单独的应用程序编写,而是计划将其作为SQLCLR编写,这样就可以很容易地调用这些SQLCLR编写的验证规则 这是我第一次使用/探索SQLCLR,所以我担心性能会因此下降。 我正在做一些类似于将c应用程序转换为SQLCLR应用程序的事情 请就上述场景下sqlClr的性能向我提出建议 提前感谢没有任何具体的例子说明需

我必须在插入新行后立即验证表中的所有数据行

详细信息:插入到表中的每一行都应通过一组验证规则,这些规则可能因行内的数据而异。 用c编写时,它看起来像一个小应用程序。因此,我不打算将其作为单独的应用程序编写,而是计划将其作为SQLCLR编写,这样就可以很容易地调用这些SQLCLR编写的验证规则

这是我第一次使用/探索SQLCLR,所以我担心性能会因此下降。 我正在做一些类似于将c应用程序转换为SQLCLR应用程序的事情

请就上述场景下sqlClr的性能向我提出建议


提前感谢

没有任何具体的例子说明需要对数据进行什么样的验证,这是一个非常普遍的问题,很难给出比一般建议更多的东西。至此,以下是一些有关SQLCLR或SQL Server与T-SQL中的CLR功能的一般信息:

纯T-SQL总是比a-SQL快,这绝对不是真的 执行相同操作的CLR例程。T-SQL是一种数据语言 并且不一定最适合做字符串操作或其他操作 它有功能的东西。我发表了一份相当详细的分析报告 关于这个问题的简单讨论:

数据只能通过SQL进行检索或操作,因此 如果您不打算使用.Net语言,只需包装SELECT或DML语句即可 也要执行一个计算,而这个计算在直接T-SQL中并没有那么快,甚至不可能。 SQLCLR例程仍然需要打开数据库连接才能进行交互 使用数据库对象、表、视图等,即使使用 上下文连接,如果代码在 SqlCommand,那么这是一个糟糕的SQLCLR设计/使用

SQLCLR不应被视为 T-SQL的替代品。需要将其作为一种工具加以处理,以提供帮助 在某些地方,如果其中一个操作效率较低 在T-SQL中,甚至不可能。有时可以扩展功能 通过使用sp_OACreate等,但这有其自身的问题。我发现最好是 在某些算法不容易或不可能的情况下,有一个中间立场 通过用户定义的 从T-SQL代码调用的函数和存储过程。我创造了一个 函数库和过程来实现这一点,称为SQL SQLsharp,大部分是免费的,可在以下网址找到:

考虑到所有这些,您的情况如下:

我必须在创建新行时验证表中的所有数据行 插入。 ... 插入表中的每一行都应通过一组 验证规则,并且这些规则可能会因数据库中的数据而异 划船

听起来它最适合在表上使用常规的T-SQL插入、更新触发器,该触发器使用直接的T-SQL和一些SQLCLR例程的组合,具体取决于对插入的表执行的特定验证。同样,根据您用于验证的特定算法,对于在CLR中完成得更好的算法,您可以通过将其中一些算法组合到一个.Net例程中来获得一些效率,以减少调用外部例程的启动成本

当然,触发器是否最佳取决于插入和更新的频率、正在进行的验证数量以及几年内表中的行数。如果DML频率非常高和/或有很多行,那么断开连接的方法可能更好,但这不会改变关于如何实现验证算法的建议。如果验证将花费很长时间,您不想让DML操作延迟太长并导致阻塞,那么您可以使用触发器将键值存储在单独的队列表中,SQL作业可以每隔几分钟处理一次,并决定是否保留

正如我在一开始所说的,验证的示例将允许更好地建议在哪里最好地处理每个算法,但希望这些信息能够为您提供做出更好决策所需的信息


请记住,只有通过测试,您才能知道对于任何特定算法,哪种方法更快

如果性能是一个主要问题,那么最好在T-SQL存储过程中编写验证代码并避免CLR,或者更好地使用DDL实现验证声明。谢谢回复。在我的场景中,我计划创建一个单独的c类库,将这些DLL包含到SQL中,并使用在这些DLL中编写的函数来验证行。我说得对吗?在sql?中添加dll是否违反了标准设计规则。验证
从技术上讲,可以使用CLR进行初始化,但T-SQL对于SQL Server数据访问速度更快。如果性能是一个主要问题,并且您可以控制所有验证逻辑,而不依赖于其他程序集,那么可能没有理由不使用t-SQL。甚至更好的性能,考虑使用DDL唯一密钥验证数据,例如,不重新扫描每一行的表中的所有行,这可能导致大的可擦除性问题。