我有一个使用MS SQL Server的应用程序,我需要从文件中进行批量插入。关键是数据库和我的应用程序将托管在不同的服务器上。在网络中进行批量插入的最佳方法是什么?到目前为止,我想出了两个想法:
从应用服务器共享数据库服务器可以找到的目录,并使用远程文件中的批量插入语句进行导入
从数据库服务器运行FTP服务器 - 执行导入时,只需将文件ftp到数据库服务器,然后使用本地文件中的批量插入执行导入(我倾向于此选项)。
是否有其他人可以告诉我是否有更好的方法可以做到这一点,或者如果没有,哪一个最有意义,为什么?
答案 0 :(得分:2)
我以前做过,并尝试了两种选择。
最后,我做了与选择相反的事情1.共享应用程序可以找到的数据库服务器上的目录。您不必在批量插入期间处理带宽问题。
如果您特别关注安全性或可转移性,则FTP服务器选项有效。
最后一个选项(非常小心)是将DTS与本地化SQL服务器一起使用。它可能更安全。如果你做错了,它的效率会低得多。
答案 1 :(得分:1)
我仍在寻找在MS SQL中执行此操作的方法,但我在MySQL中所做的是将CSV作为BLOB保存在临时表中,在本地目录中运行SELECT ... INTO DUMPFILE数据库服务器,然后在该本地文件上运行常规的LOAD DATA语句(编辑:我觉得我应该指出,这是在LOAD DATA LOCAL可用之前)。
我认为spWriteStringToFile会做到这一点。
编辑:我正在做点什么。comm.CommandText = @"EXEC spWriteStringToFile @data, 'c:\datadumps', 'data.csv';
BULK INSERT my_table FROM 'c:\datadumps\data.csv';";
comm.Parameters.AddWithValue("data", File.ReadAllText(path));
comm.ExecuteNonQuery();
答案 2 :(得分:0)
如果文件足够小,那么ftp选项可能有用(你的数据库框中会有一个副本)。但是,如果您在两者之间只有一个跳跃的千兆位网络,我认为选项1)没有太大问题。
答案 3 :(得分:0)
我不确定2k08,因为有一些额外的实用程序可以在服务器之间复制文件。 FTP将是两者中较快的,因为它不使用窗口的文件系统来传输文件。 (有开销,但除非文件很大,否则可能会忽略不计)。不使用共享还有其他优点,例如远程服务器文件崩溃中途访问。
我不同意cmartin有关向数据库服务器添加开放共享的信息。通常,您不希望将文件共享打开到数据库服务器,因为它通常被认为是安全风险,并且很多地方都不允许这样做。这就是说它会否定你将文件传输到另一个位置以使用批量导入。
答案 4 :(得分:0)
实际上,您可以将文件放在应用程序和数据库服务器上。
两个文件必须是相同的路径。从应用程序服务器,目的仅用于选择。数据库服务器用于批量插入。
这就是我为我的客户所做的事情,他们也同意这个简单的伎俩。