3

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 で構成された製造機械を購入します。彼らは私が投稿したこれらのスクリプトを提供しているので、なぜ彼らがそうしたことを選んだのかについてコメントすることはできません. サーバーにデータをプルするジョブを実行するだけです。

スクリーンショット

4

2 に答える 2

0

ここにいる別の人がこの隠れた機能を見つけました。これにより、差し迫った問題は解決されますが、他の未知の問題が発生する可能性があります。

テーブル デザイナー ビューで、列Usersを右クリックしてIndexes/Keys...を選択し、この作成されたキーを見つけてIs Unique値を変更します。OpIDIX_tblUsers_OpID

スクリーンショット

これで、DTS パッケージが実行できるようになったように見え、それが現在進行中です。

EmployeeInfoSQL 2000 Serverの元のテーブルに戻り、次のOpIDスクリプトを使用して値の重複をチェックしました。

select FirstName + ' ' + LastName as 'OpID',
       Count(FirstName + ' ' + LastName) as 'Occurrences'
from EmployeeInfo
group by FirstName + ' ' + LastName
having 1 < count(FirstName + ' ' + LastName)

...しかし、返されたレコードはありませんでした。

なぜ DTS パッケージが失敗したのか、なぜ Unique 機能をオフにしなければならなかったのかはわかりません。

将来、誰かがこれに対するより良い修正を思いついたら、投稿してください!

于 2013-10-08T15:26:55.153 に答える