最近我们把一套复杂的基于C#调度逻辑变成SQL CLR存储过程(在SQL Server 2005上运行)。 我们相信,我们的代码是一个伟大的SQL CLR候选人,因为:
- 逻辑涉及吨从SQL Server数据。
- 其中的逻辑是复杂的,很难用T-SQL来完成
- 有没有从沙箱之外的线程或sychronization或访问资源。
我们的SP的结果是相当不错至今。 但是,由于我们的逻辑的输出是几个数据表的形式,我们不能只返回单个行作为SP的结果。 取而代之的是,在我们的代码,我们有很多的foreach循环“INSERT INTO ...”语句,以便从C#泛型集合每个记录保存到SQL表。 在代码审查,有人提出了对SQL CLR内联SQL INSERT方法是否会引起perforamnce问题,不知道是否有其他更好的方式来转储数据输出(从我们的C#泛型集合)的关注。
因此,任何建议吗?
我跑过这个 ,同时在SQLite的项目上工作了几个月后发现它启发。 我想这可能是你在找什么。
...
使用标准的ADO.NET结构中插入数据最快的通用的方法
现在,缓慢的东西是闪开,让我们谈谈一些铁杆批量加载。 除了SqlBulkCopy的,涉及来自其他供应商的ISAM或定制批量插入类专业结构,根本就没有一个参数化的INSERT语句跳动的ExecuteNonQuery()的原始动力。 我将演示:
internal static void FastInsertMany(DbConnection cnn) { using (DbTransaction dbTrans = cnn.BeginTransaction()) { using (DbCommand cmd = cnn.CreateCommand()) { cmd.CommandText = "INSERT INTO TestCase(MyValue) VALUES(?)"; DbParameter Field1 = cmd.CreateParameter(); cmd.Parameters.Add(Field1); for (int n = 0; n < 100000; n++) { Field1.Value = n + 100000; cmd.ExecuteNonQuery(); } } dbTrans.Commit(); } }
你可以返回与充满了许多行,你有内部集合2列(COLLECTION_NAME为nvarchar(最大),内容的XML)的表。 内容将集合中的数据的XML表示。
然后你可以使用SQL 2005/2008的XML功能,每个集合的XML解析成表,并执行INSERT INTO的或MERGE对整个表的语句。
这应该是比你的C#代码中个别INSERTS快得多。
文章来源: Any Best practice of doing table record insert with SQL CLR store procedure?