在我的DTSpackage中,我有这个来创建一个表...
CREATE TABLE [fwAIR].[dbo].[tblPRODUCTIVITY] (
[CMS_Login] varchar (5) NOT NULL,
[DeptIndex] tinyint NOT NULL,
[CMS_Date] datetime NOT NULL,
[AssociateNumber] int NULL,
[TotalCalls] smallint NULL,
[StaffTime] int NULL,
[ACDTime] int NULL,
[ACWTime] int NULL,
[PureAuxTime] int NULL,
[AuxInTime] int NULL,
[AuxOutTime] int NULL,
[HoldTime] int NULL,
[RingTime] int NULL,
[AvailableTime] int NULL,
[CallTime] int NULL,
[TotalNPTMinutes] smallint NULL,
[Active] char (1) NULL,
[iOther] int NULL,
[RcdCreateUser] varchar (15) NULL,
[RcdUpdtUser] varchar (15) NULL,
[RcdCreateDateTime] datetime NULL,
[RcdUpdtDateTime] datetime NULL,
sdtImportDate smalldatetime NOT NULL DEFAULT GETDATE(),
CONSTRAINT idxPRODUCTIVITY_PK PRIMARY KEY NONCLUSTERED (DeptIndex, CMS_Login, CMS_Date)
);
CREATE NONCLUSTERED INDEX idxPRODUCTIVITY
ON tblPRODUCTIVITY (AssociateNumber, CMS_Date);
CREATE CLUSTERED INDEX idxPRODUCTIVITY_DeptIndex_Date
ON tblPRODUCTIVITY (DeptIndex, CMS_Date);
当我将文本文件导入此表时,出现以下错误。
错误源:用于SQL Server的Microsoft OLE DB提供程序
错误说明:执行时报告失败。该 声明已经终止。违反PRIMARY KEY约束 “idxProductivity_PK”。无法在对象中插入重复键 'tblProductivity'。
我在线阅读我可以添加到创建表部分
ALTER INDEX idxPRODUCTIVITY_PK on fwAIR.dbo.tblPRODUCTIVITY
SET (IGNORE_DUP_KEY = ON);
但被告知它不起作用,它仍然会出错。我被告知我也可以“创建模仿IX并添加该选项”。哪个应该有用。
在摆脱这个错误并让它继续导入时,我有点迷失。
答案 0 :(得分:2)
我建议你创建一个临时表,其中所有列都是varchar()
(或nvarchar()
)。
将数据导入登台表。然后尝试从那个创建实际的表。
如果您在第一步中遇到问题,那么数据文件可能不是您认为的格式。如果您在第二步中遇到问题,可以参考实际数据查看内容问题是。
答案 1 :(得分:2)
将数据导入临时表,一旦在sql server中有数据,就保持数据类型尽可能丢失。
根据需要消除任何重复项和更多数据操作,然后将数据插入到实际目标数据中。
将数据直接导入表格绝不是一个好主意。如果您的源文件中有任何垃圾数据,它可能会让您做很多清理工作。 :)
答案 2 :(得分:1)
这不是错误。您的表定义表示不允许在DeptIndex, CMS_Login and CMS_Date
列中包含2个(或更多)具有相同值的行。这是表中每行的主键(或唯一标识符)..
所以:
答案 3 :(得分:1)
如果您遇到主键违规,那是因为1)您尝试导入的文件中有重复的行或2)如果您的表有数据,您尝试导入的文本文件中有一个表格中的相同行。
您需要做的是1)删除主键或2)更改组成键的列,以使行真正唯一。
要找出您的行是重复的,您可以删除:
CONSTRAINT idxPRODUCTIVITY_PK PRIMARY KEY NONCLUSTERED (DeptIndex, CMS_Login, CMS_Date));
导入文本文件,然后运行此SELECT语句:
SELECT DeptIndex, CMS_Login, CMS_Date
FROM [fwAIR].[dbo].[tblPRODUCTIVITY]
GROUP BY DeptIndex, CMS_Login, CMS_Date
HAVING COUNT(*) > 1