Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用大容量插入映射列_Sql_Sql Server_Sql Server 2008_Sql Server Express_Bulkinsert - Fatal编程技术网

Sql 使用大容量插入映射列

Sql 使用大容量插入映射列,sql,sql-server,sql-server-2008,sql-server-express,bulkinsert,Sql,Sql Server,Sql Server 2008,Sql Server Express,Bulkinsert,我有一个CSV文件,有600万行。每行由相同的格式组成,例如/ I,h,q,q,3,A,5,Q,3,[,5,Q,8,c,3,N,3,E,4,F,4,g,4,I,V,9000,0000001-100,G9999999990001800000000000001,G9999999990000001100PDNELKKMMCNELRQNWJ010, , , , , , ,D,Z 我在一个表中有两列 第一列应该是CSV中的字段27,第二列应该是CSV文件中的整行 我已尝试设置格式文件,但无法使其正常工作

我有一个CSV文件,有600万行。每行由相同的格式组成,例如/

I,h,q,q,3,A,5,Q,3,[,5,Q,8,c,3,N,3,E,4,F,4,g,4,I,V,9000,0000001-100,G9999999990001800000000000001,G9999999990000001100PDNELKKMMCNELRQNWJ010, , , , , , ,D,Z
我在一个表中有两列

第一列应该是CSV中的字段27,第二列应该是CSV文件中的整行

我已尝试设置格式文件,但无法使其正常工作

甚至可以进行这种映射吗

以下是我所拥有的:

BULK INSERT Staging FROM 'C:\Data.txt' 
   WITH 
   (
      FIELDTERMINATOR =',',
      ROWTERMINATOR ='\n',
      KEEPNULLS,
      formatfile='C:\format.fmt'
   )
这是我的格式文件

9.0
2
1       SQLCHAR       0       40     ","     27     Col27               SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR       0       200     "\r\n"  1     Col1               SQL_Latin1_General_CP1_CI_AS

相比之下,我在SQLite中使用它需要2分钟35秒。

你可以用几种方法解决这个问题,但我的方法是通过动态SQL将整个csv文件批量插入临时表:

CREATE TABLE #BulkLoadData(
    RecordData NVARCHAR(max)
)


SET @SQL = 'BULK INSERT #BulkLoadData FROM ''' + @SourceFileFullPath + ''' '
SET @SQL = @SQL + 'WITH (FORMATFILE = ''' + @UPXInputFileBulkLoadFormat + 'UPXInputFileBulkLoadFormat.xml'', TABLOCK, ROWS_PER_BATCH = 2500 ) '

EXECUTE (@SQL)
然后可以将数据插入目标表,如下所示:

INSERT INTO dbo.TargetTable
SELECT dbo.fnParseString(27, ',', RecordData), RecordData
您需要创建如下解析函数:

CREATE FUNCTION [dbo].[fnParseString]
(
    @Section SMALLINT,
    @Delimiter CHAR,
    @Text VARCHAR(MAX)
)
RETURNS VARCHAR(8000)
AS

BEGIN
DECLARE @startindex NUMERIC(18,0),
     @length NUMERIC(18,0),
     @FieldPosition INT

 SET @FieldPosition = ABS(@Section) - 1
 SET @startindex = 0


 WHILE @FieldPosition != 0
 BEGIN
    SET @FieldPosition = @FieldPosition - 1
     SET @startindex = CHARINDEX(@Delimiter, @Text, @startindex + 1) 
 END     


 SET @Text = SUBSTRING(@Text, @startindex + 1, LEN(@Text) - @startindex)
 SET @Text = SUBSTRING(@Text, 0, CHARINDEX(@Delimiter, @Text))

 RETURN @Text
END
希望有帮助!如果您需要有关格式化文件的帮助,请告诉我

以下是文件内容的格式:

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <RECORD>
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\n" MAX_LENGTH="8000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  </RECORD>
  <ROW>
    <COLUMN SOURCE="1" NAME="RecordData" xsi:type="SQLVARYCHAR"/>
  </ROW>
</BCPFORMAT>


可能吗?对也许您可以包括您尝试过的内容,有人可能会发现问题。现在我知道您正在尝试做什么,我认为您必须使用一个临时表,正如Chris Townsend所建议的那样。我想我需要有关格式文件的帮助,因为整行都是一列。我已经发布了我的格式文件,但不确定整行列是否正确。我确实考虑过这种方法,但我认为插入/更新带有子集的表的时间太长。您也可以直接将一列(RecordData)大容量插入到目标表中,然后运行一个填充“其他”列的更新。我刚刚将一个大容量插入到一个临时表中,这比SQLite花费的时间更长。是这样吗?