【发布时间】:2015-04-04 14:40:14
【问题描述】:
我们有一个从文本文件中解析数据的 C# 应用程序。然后,我们必须根据文本文件中的信息更新 sql 数据库中的记录。将数据从应用程序传递到 SQL 服务器的最有效方法是什么?
我们目前使用分隔字符串,然后在存储过程中循环遍历该字符串以更新记录。我也在使用 TVP(表值参数)进行测试。还有其他选择吗?
我们的文件包含数千条记录,我们想要一个花费最少时间的解决方案。
【问题讨论】:
-
另一个选项是将文件批量插入到 SQL Server 中的临时表中(使用
BCP.EXE或SSIS或BULK INSERT关键字),然后使用将其从临时表转换为最终表一个存储过程。与 C# 相比,SQL 在排序、查找、分组、汇总方面效率很高,但在文本操作方面不太好。你的文本文件是什么格式的,需要什么样的处理? -
数以千计的记录对于 SQL Server 来说是小菜一碟,您可以随意执行此操作,重复 10 次,仍然会很快
-
TVP 将比遍历字符串更有效。在我的测试中,它通常胜过所有其他字符串拆分机制,甚至是 CLR。但是,如果您在字符串列上有索引,另一种方法是将变量作为字符串和逗号分隔传递,例如
'Smith','Jones','Frankenstein'然后在动态 SQL 中组装它(假设这里有一堆关于 SQL 注入的免责声明,稍后再阅读)。也就是说,根据字符串识别要更新的行(尤其是当您谈论像 JSON 这样的多值字符串时)听起来像是一个糟糕的 ida。 -
大多数人犯的错误是尝试仅发送以逗号分隔的字符串,例如
Smith,Jones,Frankenstein然后尝试将其提供给IN(@parameter)或构造动态 SQL - 将不起作用,因为参数是IN()的单个元组,并且是动态 SQL 的一组列名。 -
TVP 可能对您的 C# 代码也更有效,毕竟您可能正在以某种低效的方式构建逗号分隔的字符串,但最终基于结构更好的东西,例如 DataTable,对吧?
标签: c# sql sql-server