Consider the following scenario. In Microsoft SQL Server 2005, you create a table that
contains a nonclustered primary key. Then, you
create another table that
contains a foreign key.
The foreign key
references
the first table. Additionally,
the foreign key defines one of the following cascading actions:
| • | ON DELETE SET NULL |
| • | ON DELETE SET DEFAULT |
You run a
DELETE statement that uses a
join in the FROM clause against
the first table. In this scenario, you may receive the following error
message:
Msg 8624, Level 16, State 21, Line 1
Internal Query Processor Error: The query processor could not produce a
query plan. For more information, contact Customer Support Services.
Back to the top
This issue occurs because the join in the FROM clause may produce multiple copies of a given target row. However, the delete operator should only delete a row one time. Therefore, the execution plan has to have an additional operator between the join and the delete operator. This additional operator will eliminate duplicate rows. The additional operator only produces required information about the target row to locate it in the heap of the table or in the clustered index. To implement the cascading action, SQL Server 2005 adds a join before the delete operator. It does this by using the primary key values of the deleted rows to find corresponding rows in the foreign table. If the primary key is the clustering key, the join can use the locator information that is produced by the additional operator. However, if the primary key is a nonclustered primary key, the information that is produced by the additional operator differs from the information that is required by the join. Therefore, SQL Server 2005 generates an incorrect execution plan.
Back to the top
The fix for this issue was first released in Cumulative Update 8. For more information about how to obtain this cumulative update package for SQL Server 2005 Service Pack 2, click the following article number to view the article in the Microsoft Knowledge Base:
951217 (http://kbalertz.com/Feedback.aspx?kbNumber=951217/) Cumulative update package 8 for SQL Server 2005 Service Pack 2
Note Because the builds are cumulative, each new fix release contains all the hotfixes and all the security fixes that were included with the previous SQL Server 2005 fix release. Microsoft recommends that you consider applying the most recent fix release that contains this hotfix. For more information, click the following article number to view the article in the Microsoft Knowledge Base:
937137 (http://kbalertz.com/Feedback.aspx?kbNumber=937137/) The SQL Server 2005 builds that were released after SQL Server 2005 Service Pack 2 was released
Microsoft SQL Server 2005 hotfixes are created for specific SQL Server service packs. You must apply a SQL Server 2005 Service Pack 2 hotfix to an installation of SQL Server 2005 Service Pack 2. By default, any hotfix that is provided in a SQL Server service pack is included in the next SQL Server service pack.
Back to the top
To work around this problem, use one of the following methods:
| • | Create a clustered primary key
instead of a nonclustered primary key in the table against which you run the
DELETE statement. |
| • | Rewrite the DELETE statement to avoid the duplicate rows. For example, you have the following problematic query. DELETE Table1 FROM Table1 JOIN Table2 on Table1.col1 = Table2.col1 You can rewrite the query as the following.WITH cte AS (
SELECT c FROM Table1 WHERE Table1.col1 IN (SELECT col1 FROM Table2)
)
DELETE cte; |
| • | Remove the cascading action from the foreign key. |
Back to the top
Microsoft
has confirmed that this is a problem in the Microsoft products that are listed
in the "Applies to" section.
Back to the top
For more information about what files are changed, and for information about any prerequisites to apply the cumulative update package that contains the hotfix that is described in this Microsoft Knowledge Base article, click the following article number to view the article in the Microsoft Knowledge Base:
951217 (http://kbalertz.com/Feedback.aspx?kbNumber=951217/) Cumulative update package 8 for
SQL Server 2005 Service Pack 2
Back to the top
For more
information about the list of builds that are available after SQL Server
Service Pack 2, click the following article number to view the article in the
Microsoft Knowledge Base:
937137 (http://kbalertz.com/Feedback.aspx?kbNumber=937137/) The SQL Server 2005 builds that were released after SQL Server 2005 Service Pack 2 was released
For more information about the Incremental Servicing Model for SQL
Server, click the following article number to view the article in the Microsoft
Knowledge Base:
935897 (http://kbalertz.com/Feedback.aspx?kbNumber=935897/) An Incremental Servicing Model is available from the SQL Server team to deliver hotfixes for reported problems
For more information about how to obtain SQL Server 2005 Service
Pack 2, click the following article number to view the article in the Microsoft
Knowledge Base:
913089 (http://kbalertz.com/Feedback.aspx?kbNumber=913089/) How to obtain the latest service pack for SQL Server 2005
For more information about the new features and the improvements
in SQL Server 2005 Service Pack 2, visit the following Microsoft Web site:
For more information about the naming schema for SQL Server
updates, click the following article number to view the article in the
Microsoft Knowledge Base:
822499 (http://kbalertz.com/Feedback.aspx?kbNumber=822499/) New naming schema for Microsoft SQL Server software update packages
For more information about software update terminology, click the
following article number to view the article in the Microsoft Knowledge Base:
824684 (http://kbalertz.com/Feedback.aspx?kbNumber=824684/) Description of the standard terminology that is used to describe Microsoft software updates
Back to the top