SQL Server身份相关的错误

时间:2013-04-25 09:32:28

标签: sql-server sql-server-2008 identity-column

我在SQL SERVER 2008中使用此查询..

SET IDENTITY_INSERT ABC ON

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

并收到错误:

  

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

'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

3 个答案:

答案 0 :(得分:1)

James,您收到错误,因为您的csv文件包含9个列值,但您的表结构包含10列..这就是您收到该错误的原因.. 如果您将Identity_Insert ABC设置为关闭  然后你就不会有错误

答案 1 :(得分: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 

答案 2 :(得分:0)

来自Keep Identity Values When Bulk Importing Data (SQL Server)

  

防止SQL Server在批量时分配标识值   将数据行导入表中,使用适当的keep-identity   命令限定符。指定保持标识限定符时,SQL   服务器使用数据文件中的标识值。这些限定符是   如下:

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