由于重复键行,DTS包终止

时间:2013-10-07 20:39:14

标签: sql-server sql-server-2008 dts

我们有一个旧的DTS包,我们的SQL 2000 Server用它来将员工记录推送到我们生产车间的机器上。

最近,我们升级了其中一台机器,现在它正在运行SQL 2008 Express。

我们已重新配置DTS包以将Employee记录推送到此新服务器,但现在我们收到此错误消息:

FETCH_EMPLOYEES:

  

该声明已被终止。无法在具有唯一索引“IX_tblUsers_OpID”的对象“dbo.Users”中插入重复的键行。

screenshot

如果我远程访问我们的SQL 2000 Server,我可以右键单击以连续执行DTS包的每一步,并且没有错误。

screenshot

所以,我登录到这台机器的SQL 2008 Express实例,看看我是否可以解决任何问题。

现在我正在查看 FETCH_EMPLOYEES 存储过程:

PROCEDURE [dbo].[FETCH_EMPLOYEES] AS
DECLARE @OpID varchar(255)
DECLARE @Password varchar(50)
DECLARE Employee_Cursor CURSOR FOR
SELECT OpID, Password
FROM dbo.vw_Employees
OPEN Employee_Cursor
FETCH NEXT FROM Employee_Cursor
INTO @OpID,@Password
WHILE @@FETCH_STATUS = 0
BEGIN
insert into dbo.Users (OpID,Password,GroupID) 
VALUES (@OpID,@Password,'GROUP01')
FETCH NEXT FROM Employee_Cursor
INTO @OpID,@Password
END
CLOSE Employee_Cursor
DEALLOCATE Employee_Cursor

我并不真正了解游标,但我可以说这些数据是从名为vw_Employees的视图中提取的,并被插入到表dbo.Users中。

视图vw_Employees很简单:

SELECT DISTINCT FirstName + ' ' + LastName AS OpID, Num AS Password
FROM         dbo.EmployeeInfo
WHERE     (Num IS NOT NULL) AND (FirstName IS NOT NULL)
      AND (LastName IS NOT NULL) AND (Train IS NULL OR Train <> 'EX')

所以,现在似乎问题必须来自表dbo.Users

screenshot

我没有看到任何特别关注这个,所以我使用CREATE TO Query Editor编写了这个表,并得到了我不太了解的信息:

CREATE TABLE [dbo].[Users](
[ID] [int] IDENTITY(1,1) NOT NULL,
[OpID] [nvarchar](255) NOT NULL,
[Password] [nvarchar](50) NOT NULL,
[GroupID] [nvarchar](10) NOT NULL,
[IsLocked] [bit] NOT NULL,
    CONSTRAINT [PK_tblUsers] 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

ALTER TABLE [dbo].[Users]  WITH CHECK ADD  CONSTRAINT [FK_tblUsers_tblGroups] FOREIGN KEY([GroupID])
REFERENCES [dbo].[Groups] ([GroupID])
GO

ALTER TABLE [dbo].[Users] CHECK CONSTRAINT [FK_tblUsers_tblGroups]
GO

ALTER TABLE [dbo].[Users] ADD  CONSTRAINT [DF_tblUsers_IsLocked]  DEFAULT ((0)) FOR [IsLocked]
GO

好的,我觉得问题出现在这个表定义的某个地方,但是我真的不明白它在做什么(在创建基本表之后)。

它有一个CONSTRAINT部分,包含许多我不理解的变量,然后它正在改变这些表以添加FOREIGN KEY和CONSTRAINTS。

我的问题:有人可以帮助我理解错误告诉我的内容(除了有一些重复的密钥违规)。

什么列可能会导致重复的密钥违规?

我是否包含足够的数据和屏幕截图?

更新

根据评论,听起来需要这个屏幕截图。

用户表中,有一个索引列表,一个名为IX_tblUsers_OpID的索引表示它是唯一且非群集的。

我认为通过使用此脚本查找所有值,我们已消除了源数据表Op_ID上的重复EmployeeInfo值:

select num as 'Op_ID', count(num) as 'Occurrences'
from employeeInfo
group by num
having 1<count(num);

这个应该已经摆脱了我的所有重复。正确?

我们购买配置有PC的制造机器,用于存储本地数据。他们提供了我发布的这些脚本,所以我不能评论为什么他们选择了他们所做的。我们只是运行一项将数据提取到服务器上的工作。

screenshot

1 个答案:

答案 0 :(得分:0)

在这里工作的另一个人发现了这个隐藏的功能,它解决了当前的问题,但可能会导致其他未知问题。

Users表设计器视图中,我们可以右键单击OpID列,选择索引/键... ,找到此创建的{{1} }键并更改它的是唯一的值:

screenshot

这似乎已经让DTS包运行了,这就是我们现在所做的。

我回到SQL 2000 Server上的原始IX_tblUsers_OpID表,使用此脚本检查重复的EmployeeInfo值:

OpID

...但没有返回任何记录。

我不确定为什么DTS包失败或为什么我们不得不关闭Unique功能。

如果有人在接下来的某个时间为此提出了更好的解决方法,请发帖!