0

我能听到你说:那没那么简单,不是吗。

这是表格:

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。

4

1 回答 1

1

你的问题不是这个问题的完全重复你没有得到任何错误),但它是同一个问题。正如文档所说

对于 XML 格式文件,当您使用 bcp 命令或 BULK INSERT 语句直接导入表时,不能跳过列。但是,您可以导入到表的最后一列以外的所有列。如果必须跳过除最后一列以外的任何列,则必须创建目标表的视图,该视图仅包含数据文件中包含的列。然后,您可以将该文件中的数据批量导入到视图中。

也就是说,使用 XML 格式文件时,只能跳过表中的最后一列。但是您正试图跳过该Id列,即第一列。

两种解决方案是:

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

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

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

于 2013-04-19T21:39:53.880 回答