【问题标题】:import data from text file into sql table将文本文件中的数据导入sql表
【发布时间】:2014-12-27 17:39:06
【问题描述】:

我在文本文件中有数据 (field1,field2,fiel3,field4) , (field1,field2,fiel3,field4),... 我想在sql server表中导入这个..请帮助

(699,429,1,'2000-11-30 04:34:16'),(699,2170,2,'2000-11-30 04:07:23'),(699,2171,2,'2000-11-30 04:21:44'),(699,919,4,'2001-04-05 03:21:50'),(699,3160,5,'2000-11-30 04:16:29'),(699,1250,3,'2001-04-05 03:18:20')

【问题讨论】:

  • 请展示您的尝试。
  • 我尝试通过 sql server 中的向导导入,但没有将文本文件中的数据导入 sql 表的选项....存在将数据从 excel 导入 sql server 表的选项跨度>
  • 除了使用导入/导出向导或 SSIS 将数据移动到 SQL Server 之外,还有一些其他内置于 SQL Server 中的选项用于执行此操作。其他一些选项包括 bcp、BULK INSERT、OPENROWSET 等
  • 我的数据存储在 .txt 文件中,其中每个字段在 () 括号内用逗号分隔...例如:(f1,f2,f3,f4),(f5,f6,f7 ,f8) 其中 f1,f2,f3,f4 是记录 1 字段数据,f5,f6,f7,f8 是与记录 2 相关的数据。抱歉英语不好

标签: mysql sql sql-server sql-server-2008 sqlite


【解决方案1】:

从您的文本文件中读取数据并首先将其导入 SQL Server。然后尝试使用 t-sql 中可用的所有功能来操作它。

我会做类似......

查询

DECLARE @FileTable TABLE (FileData NVARCHAR(MAX))

INSERT INTO @FileTable
SELECT BulkColumn 
FROM OPENROWSET(BULK N'C:\Path_to_Text_File\Test_Text_FIle.txt', SINGLE_CLOB) AS Contents

;WITH CTE AS(
 SELECT REPLACE(
         REPLACE(
           REPLACE(
              REPLACE(FileData, '),(', '|')
               , '(', '') 
             , ')', '')
            , '''', '')   AS TextData
              FROM @FileTable
 ),Column_Split AS
 (
 SELECT CONVERT(XML,'<Columns><Column>'  
   + REPLACE(val,',', '</Column><Column>') + '</Column></Columns>') [Columns]
 FROM CTE C CROSS APPLY dbo.split(c.TextData, '|')
)
SELECT      
   [Columns].value('/Columns[1]/Column[1]','varchar(100)') AS Column1,    
   [Columns].value('/Columns[1]/Column[2]','varchar(100)') AS Column2,
   [Columns].value('/Columns[1]/Column[3]','varchar(100)') AS Column3,
   [Columns].value('/Columns[1]/Column[4]','varchar(100)') AS Column4
 FROM Column_Split

结果

╔═════════╦═════════╦═════════╦═════════════════════╗
║ Column1 ║ Column2 ║ Column3 ║       Column4       ║
╠═════════╬═════════╬═════════╬═════════════════════╣
║     699 ║     429 ║       1 ║ 2000-11-30 04:34:16 ║
║     699 ║    2170 ║       2 ║ 2000-11-30 04:07:23 ║
║     699 ║    2171 ║       2 ║ 2000-11-30 04:21:44 ║
║     699 ║     919 ║       4 ║ 2001-04-05 03:21:50 ║
║     699 ║    3160 ║       5 ║ 2000-11-30 04:16:29 ║
║     699 ║    1250 ║       3 ║ 2001-04-05 03:18:20 ║
╚═════════╩═════════╩═════════╩═════════════════════╝

拆分函数定义

CREATE FUNCTION [dbo].[split](  
  @delimited NVARCHAR(MAX),  
  @delimiter NVARCHAR(100)  
) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))  
AS  
BEGIN  
  DECLARE @xml XML  
  SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'  

  INSERT INTO @t(val)  
  SELECT  r.value('.','varchar(MAX)') as item  
  FROM  @xml.nodes('/t') as records(r)  
  RETURN  
END

【讨论】:

  • 实际上在我的情况下,我有这种格式的数据 (1005866,185749,110,'21,172 (Portugal) (20February 1997)',NULL) 其中最后一个字段是文本字段并且可能存在;或者,在最后一个字段 sql...bulk insert 导致最后一个字段拆分
【解决方案2】:

请尝试以下方法:

BULK INSERT DBNAME.dbo.TABLENAME FROM  FULLPATH  WITH (KEEPIDENTITY,  FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' )

请记得填写您的 DB Name、Table Name 和 FullPath。

希望这会有所帮助。

【讨论】:

  • 实际上在我的情况下,我有这种格式的数据 (1005866,185749,110,'21,172 (Portugal) (20February 1997)',NULL) 其中最后一个字段是文本字段并且可能存在;或者,在最后一个字段 sql...bulk insert 导致最后一个字段拆分
  • 请帮帮我...我有大量这种格式的硬编码数据,我想插入它
猜你喜欢
  • 2015-05-31
  • 1970-01-01
  • 2012-09-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 2013-06-23
  • 1970-01-01
相关资源
最近更新 更多