使用SQL CLR存储过程执行表记录插入的最佳做法是什么?

时间:2009-07-21 02:59:26

标签: sqlclr

最近,我们将一组基于C#的复杂调度逻辑转换为SQL CLR存储过程(在SQL Server 2005中运行)。我们认为我们的代码是一个很棒的SQL CLR候选者,因为:

  • 逻辑涉及来自sQL Server的大量数据。
  • 使用TSQL
  • 逻辑复杂且难以完成
  • 没有线程或同步或从沙箱外部访问资源。

到目前为止,我们sp的结果非常好。但是,由于我们逻辑的输出是几个数据表的形式,我们不能只返回一个行集作为sp的结果。相反,在我们的代码中,我们在foreach循环中有很多“INSERT INTO ....”语句,以便将每个记录从C#泛型集合保存到SQL表中。在代码审查期间,有人担心SQL CLR中的内联SQL INSERT方法是否会导致性能问题,并想知道是否还有其他更好的方法可以将数据转储出来(来自我们的C#泛型集合)。

那么,有什么建议吗?

2 个答案:

答案 0 :(得分:2)

几个月前我在SQLite项目上工作时遇到了this,发现它很有启发性。我想这可能就是你要找的东西。

...

  

插入数据的最快通用方式   使用标准的ADO.NET构造

     

现在,缓慢的东西已经过时了   方式,让我们谈谈一些铁杆   批量装载。除了SqlBulkCopy   和专门的结构   ISAM或自定义批量插入类   来自其他供应商,简直就是这样   没有击败原始力量   参数化的ExecuteNonQuery()   INSERT语句。我将证明:

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();

    }

}

答案 1 :(得分:0)

您可以返回一个包含2列(COLLECTION_NAME nvarchar(max),CONTENT xml)的表,其中包含与您拥有的内部集合一样多的行。 CONTENT将是集合中数据的XML表示形式。

然后,您可以使用SQL 2005/2008的XML功能将每个集合的XML解析为表,并在整个表上执行INSERT INTO或MERGE语句。

这应该比C#代码中的单个INSERTS更快。