REVISIÓN: Actualizar con autocombinación puede actualizar un número incorrecto de filas

Seleccione idioma Seleccione idioma
Id. de artículo: 285870 - Ver los productos a los que se aplica este artículo
Nº DE ERROR: 101111 (SQLBUG_70)
Error nº: 351761 (SHILOH_bugs)
Expandir todo | Contraer todo

En esta página

Síntomas

Una operación UPDATE no puede modificar el número de filas correcto si se cumplen las condiciones siguientes:
  • La consulta actualiza una columna, ColA, de una tabla TabA.
  • La consulta hace referencia TabA de nuevo, mediante un alias TabB.
  • Hay una referencia a TabB.ColA en algún lugar de la consulta.
  • Ninguna de las columnas actualiza en TabA son columnas indizadas.
  • Se utiliza una combinación hash o de mezcla.

Causa

El plan de consulta no incluye una Table Spool necesarios bajo el operador UPDATE, que es necesario proporcionar protección de Halloween.

Solución

SQL Server 2000

Para resolver este problema, consiga el Service Pack más reciente para Microsoft SQL Server 2000. Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
290211INF: Cómo obtener el Service Pack más reciente de SQL Server 2000

SQL Server 7.0

Para resolver este problema, obtenga el service pack más reciente para Microsoft SQL Server 7.0. Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
301511INF: Cómo obtener el Service Pack más reciente de SQL Server 7.0


Nota : se creó la siguiente revisión antes de SQL Server 7.0 Service Pack 4.

La versión en inglés de esta revisión debe tener los atributos de archivo siguientes o posteriores:
   Version      File name       Platform
   -------------------------------------

   7.00.978     s70978i.exe     x86
   7.00.978     s70978a.exe     Alpha
				
Nota : debido a la interdependencia entre archivos, el más reciente revisión o característica que contiene los archivos anteriores quizás contenga también archivos adicionales.

Solución

Para evitar este problema:
  • Forzar una combinación de bucle mediante OPTION (LOOP JOIN).

    -o bien -

  • Agregar un índice en las columnas actualizadas.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:" de este artículo.

SQL Server 2000
Este problema se corrigió por primera vez en SQL Server 2000 Service Pack 1.

SQL Server 7.0
Este problema se corrigió por primera vez en Pack 4 de Microsoft SQL Server 7.0.

Más información

Protección de Halloween es necesario para evitar una situación donde se cambia la ubicación física de una fila dentro de una tabla debido a una operación UPDATE. Como resultado, la misma fila puede ser revisarse varias veces dentro del contexto de una única operación lógica, lo que no debería ocurrir. Si se cumplen las condiciones de este error concreto, el optimizador de SQL Server no puede crear un plan de protección de Halloween adecuada.

En el ejemplo siguiente se muestra el problema:
set nocount on
create table test(id int, pid int, fn varchar(256), rn varchar(8))
go
declare @c int
set @c = 1
insert into test values(0, NULL, 'root', 'root')
while @c < 10
begin
   insert into test values(@c, @c-1, NULL, cast(@c as varchar(8)))
   set @c = @c + 1
end
create unique clustered index idx_c_id on test(id)
go
update test
set fn = parent.fn + '/' + test.rn
from test(index=0) , test parent(index=0)
where test.pid = parent.id and test.fn is NULL --  and parent.fn <> ''
option(hash join,force order)
				
aquí están el contenido correcto de la tabla después de la actualización:

Resultados--CORRECTOS:
id          pid         rn       fn                                                                                                                                                                                                                                                               
----------- ----------- -------- ---- 
0           NULL        root     root
1           0           1        root/1
				
aquí están los resultados que obtenga antes para aplicar la revisión:

Resultados--INCORRECTOS:
id          pid         rn       fn                                                                                                                                                                                                                                                               
----------- ----------- -------- ----
0           NULL        root     root
1           0           1        root/1
2           1           2        root/1/2
3           2           3        root/1/2/3
4           3           4        root/1/2/3/4
5           4           5        root/1/2/3/4/5
6           5           6        root/1/2/3/4/5/6
7           6           7        root/1/2/3/4/5/6/7
8           7           8        root/1/2/3/4/5/6/7/8
9           8           9        root/1/2/3/4/5/6/7/8/9

				

Propiedades

Id. de artículo: 285870 - Última revisión: martes, 28 de octubre de 2003 - Versión: 3.1
La información de este artículo se refiere a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palabras clave: 
kbmt kbbug kbfix KB285870 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 285870

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com