SQL 2000 Server が従業員レコードを製造フロアのマシンにプッシュするために使用する古い DTS パッケージがあります。
最近、マシンの 1 つをアップグレードしたところ、SQL 2008 Express が実行されるようになりました。
従業員レコードをこの新しいサーバーにプッシュするように DTS パッケージを再構成しましたが、次のエラー メッセージが表示されます。
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
Cursors についてはよくわかりませんが、データが呼び出されたビューから取得vw_Employees
され、 table に挿入されていることはわかります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
OK、問題はこのテーブル定義のどこかにあると思いますが、それが何をしているのかよくわかりません (基本テーブルを作成した後)。
理解できない変数がたくさんある 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 で構成された製造機械を購入します。彼らは私が投稿したこれらのスクリプトを提供しているので、なぜ彼らがそうしたことを選んだのかについてコメントすることはできません. サーバーにデータをプルするジョブを実行するだけです。