非常简单的批量插入为CSV中的每一行插入NULL

时间:2013-04-18 11:31:48

标签: tsql bulkinsert

我可以听到你说:那就不是那么简单,是吧。

这是表格:

CREATE TABLE [bulkimport].[Test](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Data] [nvarchar](50) NULL,
 CONSTRAINT [PK_Test_1] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

这是tsql:

TRUNCATE TABLE bulkimport.Test

BULK INSERT bulkimport.Test 
FROM 'D:\Referenzliste_VKnr.csv' 
WITH (
    FORMATFILE='D:\VKnrImport.xml', 
    CODEPAGE=28591,
    ERRORFILE='D:\VKnrImportError.txt'
)

我的配置文件如下所示:

<?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="\r\n" COLLATION="SQL_Latin1_General_CP1_CI_AS" />
    </RECORD>
    <ROW>
        <COLUMN SOURCE="1"  NAME="Data" LENGTH="50" xsi:type="SQLNVARCHAR" />
    </ROW>
</BCPFORMAT>

最后,摘自数据:

18
26
34
42
59
67
75
83
91
109
117
125
133

每行后面都有一个回车换行符,最后留下一行空行。我使用SQL Server 2012为csv文件中的每个条目获取NULL。

1 个答案:

答案 0 :(得分:1)

您的问题与this one不完全相同(您没有收到任何错误),但这是同样的问题。作为文档says

  

使用XML格式文件时,您无法跳过列   使用bcp命令或BULK直接导入表   INSERT语句。但是,您可以导入除最后一列之外的所有列   一张桌子。如果你必须跳过除最后一列之外的任何一栏,你必须   创建仅包含列的目标表的视图   包含在数据文件中。然后,您可以批量导入数据   将文件存入视图。

换句话说,在使用XML格式文件时,您只能跳过表中的 last 列。但您试图跳过Id列,即第一个列。

两种解决方案是:

当我使用这个非XML格式文件时,您的数据加载良好:

10.0
1
1       SQLCHAR             0       100     "\r\n"   2     Data         Latin1_General_CI_AS

但是OPENROWSET更灵活,因为您可以使用SELECT重新排序列或以其他方式处理来自平面文件的数据。