【发布时间】:2012-03-12 23:01:45
【问题描述】:
我有一个远程 SQL 服务器。我想制作此服务器中所有表的 本地 副本。我不关心本地使用的文件格式,我正在寻找将数据从 SQL 服务器获取到文件中的最快方法。 (注意:服务器端备份不是一个选项)
这是我目前的做法:
第 1 步。创建阅读器并将所有数据读入对象列表
while (reader.Read()) {
var fieldCount = reader.FieldCount;
for (int i = 0; i < fieldCount; i++) {
objects.Add(reader.GetValue(i));
}
}
第 2 步。将对象转换为字符串
List<string> test = new List<string>();
foreach (var o in objects) {
test.Add(o.ToString());
}
第 3 步。将字符串写入(CSV)文件
foreach (var s in test) {
backupFile.Write("\"");
backupFile.Write(s);
backupFile.Write("\";");
}
我已经测量了这 3 个步骤的性能:
- 步骤 1 需要 3 秒
- 第 2 步耗时 2.8 秒
- 第 3 步需要 0.8 秒
我正在寻找一种方法来加快第 2 步。有没有更快的方法将这些对象放入文件中? (不一定是文本文件。本地数据库文件的二进制也可以)
【问题讨论】:
-
您可以在 T-SQL 查询中执行这些操作,这样它就可以返回 CSV 格式的所有内容,而不必遍历 C# 中的每条记录。
-
为什么不只循环一次数据,然后在从查询中读取每一行时进行字符串转换和文件写入?
-
我猜最快的机制是使用 SQL Server 的bulk export functionality。有一个 bcp.exe 实用程序似乎可以完全按照您的意愿进行操作。
-
@Dr.Wily'sApprentice 我很确定该方法只能写入服务器有权访问的文件。由于停止服务器端备份的相同限制,可能不可用。
-
你看过SQL Server提供的bcp (bulk copy) command-line utility吗?应该很快,可以在命令行上进行任何查询,将数据输出到磁盘上的文件中......
标签: c# .net sql sql-server-2005