If a job contains a single INSERT statement on a table that has a unique index with the IGNORE_DUP_KEY clause, and the INSERT violates the uniqueness property of the index, the corresponding row is not inserted in the table. The job step fails, and you see the following message in the job step history:
Duplicate key was ignored. [SQLSTATE 23000] (Message 3604). The step failed.
Because the table has an UNIQUE INDEX with IGNORE_DUP_KEY, the INSERT statement should be ignored and the step should succeed.
To resolve this problem, obtain the latest service pack for SQL Server 2000. For additional information, click the following article number to view the article in theMicrosoft Knowledge Base:
290211 INF: How to Obtain the Latest SQL Server 2000 Service Pack
If you place a "dummy" SELECT statement that always executes successfully (such as SELECT 1) just before the INSERT statement that fails with the 3604 error, the step succeeds. This is demonstrated in the "More Information" section.
Microsoft has confirmed that this is a problem in the Microsoft products that are listed at the beginning of this article. This problem was first corrected in SQL Server 2000 Service Pack 1.
Steps To Reproduce Behavior
Create a table test in the pubs database and execute the following script to insert a row:
USE pubsCREATE TABLE test(i int)CREATE UNIQUE INDEX uniq_t1_i on test(i) with IGNORE_DUP_KEYINSERT INTO test VALUES(1)
Create a T-SQL job in the pubs database to insert a row in table test:
INSERT INTO pubs..test values(1)
Run the job. The job fails, and the job step history shows the error listed in the "Symptoms" section.
Note that if we add a successful statement after the INSERT that encounters a 3604 error:
INSERT INTO pubs..test values(1)INSERT INTO pubs..test values(2)
the step fails again with the following error:
Duplicate key was ignored. [SQLSTATE 23000] (Message 3604) Associated statement is not prepared [SQLSTATE HY007] (Error 0). The step failed.
However, if we add a successful statement that has results before the INSERT that fails with the 3604 error: