使用 SQL CLR 存储过程进行表记录插入的最佳实践?
最近我们将一组复杂的基于C#的调度逻辑转换为SQL CLR存储过程(在SQL Server 2005中运行)。 我们相信我们的代码是一个很好的 SQL CLR 候选者,因为:
- 逻辑涉及来自 SQL Server 的大量数据。
- 逻辑很复杂,很难使用 TSQL 来完成。
- 没有线程或同步,也没有从沙箱外部访问资源。
到目前为止,我们的 sp 的结果相当不错。 但是,由于逻辑的输出采用多个数据表的形式,因此我们不能仅返回单个行集作为 sp 的结果。 相反,在我们的代码中,我们在 foreach 循环中有很多“INSERT INTO ....”语句,以便将 C# 通用集合中的每条记录保存到 SQL 表中。 在代码审查期间,有人担心 SQL CLR 中的内联 SQL INSERT 方法是否会导致性能问题,并想知道是否有其他更好的方法来转储数据(从我们的 C# 通用集合中)。
那么,有什么建议吗?
Recently we turned a set of complicate C# based scheduling logic into SQL CLR stored procedure (running in SQL Server 2005). We believed that our code is a great SQL CLR candidate because:
- The logic involves tons of data from sQL Server.
- The logic is complicate and hard to be done using TSQL
- There is no threading or sychronization or accessing resources from outside of the sandbox.
The result of our sp is pretty good so far. However, since the output of our logic is in form of several tables of data, we can't just return a single rowset as the result of the sp. Instead, in our code we have a lot of "INSERT INTO ...." statements in foreach loops in order to save each record from C# generic collection into SQL tables. During code review, someone raised concern about whether the inline SQL INSERT approach within the SQL CLR can cause perforamnce problem, and wonder if there's other better way to dump data out (from our C# generic collections).
So, any suggestion?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
几个月前,我在处理 SQLite 项目时遇到了这个,并发现它很有启发性。 我想这可能就是您正在寻找的。
...
I ran across this while working on an SQLite project a few months back and found it enlightening. I think it might be what you're looking for.
...
您可以返回一个包含 2 列的表 (COLLECTION_NAME nvarchar(max), CONTENT xml),其中填充的行数与您拥有的内部集合一样多。 CONTENT 将是集合中数据的 XML 表示形式。
然后,您可以使用 SQL 2005/2008 的 XML 功能将每个集合的 XML 解析为表,并对整个表执行 INSERT INTO 或 MERGE 语句。
这应该比 C# 代码中的单独插入更快。
You could return a table with 2 columns (COLLECTION_NAME nvarchar(max), CONTENT xml) filled with as many rows as internal collections you have. CONTENT will be an XML representation of the data in the collection.
Then you can use the XML features of SQL 2005/2008 to parse each collection's XML into tables, and perform your INSERT INTO's or MERGE statements on the whole table.
That should be faster than individual INSERTS inside your C# code.