我需要将一个csv文件导入Firebird,我花了几个小时尝试一些工具,但没有一个适合我的需求.
主要的问题是我一直在尝试的所有工具,如EMS数据导入和Firebird数据向导,我希望我的csv文件包含我的表所需的所有信息.
我需要在insert语句中编写一些自定义SQL,例如,我有一个带有城市名称的cvs文件,但由于我的数据库已经有另一个表中的所有城市(规范化),我需要在插入中编写一个子选择查找城市并写入其ID的语句,我也有一个存储过程来创建GUID.
我的Insert语句是这样的:
INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES((SELECT NEW_GUID FROM CREATE_GUID), :NAME, (SELECT CITY_ID FROM CITY WHERE NAME = :CITY_NAME)
我知道写一个应用程序来做这个很容易,但我不喜欢重新发明轮子,我确信有一些工具可以做到这一点.
你们能给我一些建议吗?
这有点粗糙 - 但对于一次性工作,我有时使用Excel.
如果将CSV文件导入Excel,则可以创建一个公式,该公式通过在公式中使用字符串连接来创建INSERT语句.那么 - 如果您的CSV文件有三列出现在Excel中的A,B和C列中,您可以编写一个类似于......的公式
="INSERT INTO MyTable(Col1,Col2,Col3)VALUES("&A1&","&B1&","&C1&")"
然后,您可以将所有行复制到公式中,然后将答案复制并粘贴到文本文件中以针对您的数据库运行.
就像我说的那样 - 它很粗糙 - 但它可以是一种'快速而肮脏'的方式来完成工作!
好吧,如果它是一个CSV,这是一次性过程,在Excel中打开文件,然后编写公式以您想要的任何方式填充数据,然后编写一个简单的Concat公式来构建您的SQL,以及然后为每一行复制该公式.您将获得大量可以在任何地方执行的SQL语句.
法比奥,
我已经完成了Vaibhav多次做过的事情,这是将数据输入数据库的一种很好的"快速而肮脏"的方式.
如果您需要执行此操作几次或某种类型的计划,那么更可靠的方法是将CSV数据"按原样"加载到工作表(即customer_dataload)中,然后使用标准SQL语句填充缺少字段.
(我不知道Firebird的语法 - 但是像......)
UPDATE person SET id = (SELECT newguid() FROM createguid) UPDATE person SET cityid = (SELECT cityid FROM cities WHERE person.cityname = cities.cityname)
等等
通常,将数据输入数据库然后修复数据比在上载期间尝试修复数据要快得多(并且更可靠).您还可以获得交易的好处,如果它不起作用,您可以使用ROLLBACK!