0

我在 SQL SERVER 2008 中使用这个查询..

SET IDENTITY_INSERT ABC ON

BULK 
INSERT ABC
FROM 'F:\test.csv'
WITH
(
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
)
GO

并得到一个错误:

当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,必须为表“ABC”中的标识列指定显式值。

'ABC' 的表结构是:

ID [int] IDENTITY(1,1) NOT NULL,  -- primary key
aa [varchar](50) NULL,
bb [varchar](50) NULL,
cc [datetime] NULL,
dd [varchar](50) NULL,
ee [varchar](50) NULL,
ff [int] NULL,
gg [varchar](50) NULL,
ii [int] NULL,
jj [int] NULL

来自 CSV 文件的样本数据

84,0b0dbe1d,192.168.10.221,2012-07-27 16:15:41.503,0b0dbe1d_16-15-18,1.0.0,2,pra,2,NULL
85,111de4b6,192.168.10.221,2012-07-27 16:27:06.060,111de4b6_16-27-05,1.0.0,8,Diane,5,NULL
4

3 回答 3

1

詹姆斯,您收到错误是因为您的 csv 文件包含 9 个列值,但您的表结构包含 10 个列。这就是您收到该错误的原因。如果您 SET Identity_Insert ABC 关闭,那么您将不会收到任何错误

于 2013-04-25T10:03:27.580 回答
0

错误清楚地表明,您需要在插入时指定列名。

我认为我们没有在批量插入期间指定列名的选项。您可以使用以下替代方法。

 select * into dbo.Stagingtable from ABC where 1=2
    go

    BULK 
    INSERT Stagingtable
    FROM 'F:\test.csv'
    WITH
    (
        FIELDTERMINATOR = ',',
        ROWTERMINATOR = '\n'
    )
    GO
    SET IDENTITY_INSERT ABC ON
GO
    INSERT INto ABC (column1,column2,etc) 
    select * from Stagingtable 
于 2013-04-25T09:49:36.207 回答
0

批量导入数据时保留标识值(SQL Server)

若要防止 SQL Server 在将数据行大容量导入表时分配标识值,请使用适当的 keep-identity 命令限定符。当您指定 keep-identity 限定符时,SQL Server 使用数据文件中的标识值。这些限定符如下:

bcp                                          | -E             |  Switch
BULK INSERT                                  | KEEPIDENTITY   |  Argument
INSERT ... SELECT * FROM OPENROWSET(BULK...) | KEEPIDENTITY   |  Table hint

该示例显示了如何在您的情况下应用此药水:

BULK 
INSERT ABC
FROM 'F:\test.csv'
WITH
(
    KEEPIDENTITY,  
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
)
GO
于 2013-04-25T09:56:47.827 回答