我们有一个旧的DTS包,我们的SQL 2000 Server用它来将员工记录推送到我们生产车间的机器上。
最近,我们升级了其中一台机器,现在它正在运行SQL 2008 Express。
我们已重新配置DTS包以将Employee记录推送到此新服务器,但现在我们收到此错误消息:
FETCH_EMPLOYEES:
该声明已被终止。无法在具有唯一索引“IX_tblUsers_OpID”的对象“dbo.Users”中插入重复的键行。
如果我远程访问我们的SQL 2000 Server,我可以右键单击以连续执行DTS包的每一步,并且没有错误。
所以,我登录到这台机器的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
。
我没有看到任何特别关注这个,所以我使用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的制造机器,用于存储本地数据。他们提供了我发布的这些脚本,所以我不能评论为什么他们选择了他们所做的。我们只是运行一项将数据提取到服务器上的工作。
答案 0 :(得分:0)
在这里工作的另一个人发现了这个隐藏的功能,它解决了当前的问题,但可能会导致其他未知问题。
在Users
表设计器视图中,我们可以右键单击OpID
列,选择索引/键... ,找到此创建的{{1} }键并更改它的是唯一的值:
这似乎已经让DTS包运行了,这就是我们现在所做的。
我回到SQL 2000 Server上的原始IX_tblUsers_OpID
表,使用此脚本检查重复的EmployeeInfo
值:
OpID
...但没有返回任何记录。
我不确定为什么DTS包失败或为什么我们不得不关闭Unique功能。
如果有人在接下来的某个时间为此提出了更好的解决方法,请发帖!