Síntomas

Cuando usa funciones SCOPE_IDENTITY() o @@IDENTITYpara recuperar los valores insertados en una columna de identidad, es posible que observe que estas funciones a veces devuelven valores incorrectos. El problema solo se produce cuando las consultas usan planes de ejecución en paralelo. Para obtener más información sobre cómo determinar si las consultas van a usar planes de ejecución paralelos, consulte la sección Paralelismo entre consultas en el siguiente artículo técnico sobre descargas de Microsoft:

Causa

Microsoft ha confirmado que este es un problema en los productos Microsoft que aparecen enumerados al principio de este artículo.

Resolución

Información sobre la actualización acumulativa

SQL Server 2008 R2 Service Pack 1

La corrección de este problema se publicó por primera vez en la actualización acumulativa 5 para SQL Server 2008 R2 Service Pack 1. Para obtener más información sobre cómo obtener este paquete de actualización acumulativa, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base: 

2659694Paquete de actualización acumulativa 5 para SQL Server 2008 R2 Service Pack 1

Nota: Como las compilaciones son acumulativas, cada nueva versión de corrección contiene todas las revisiones y todas las correcciones de seguridad que se incluyeron con la versión de corrección SQL Server 2008 R2. Le recomendamos que considere la posibilidad de aplicar la versión de corrección más reciente que contiene esta revisión. Si desea obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

2567616Se SQL Server compilaciones de 2008 R2 que se publicaron SQL Server 2008 R2 Service Pack 1

Solución alternativa

Microsoft recomienda no usar ninguna de estas funciones en las consultas cuando los planes paralelos están implicados, ya que no siempre son confiables. En su lugar, use la cláusula OUTPUT de la instrucción INSERT para recuperar el valor de identidad como se muestra en el ejemplo siguiente.

Ejemplo de uso de la cláusula OUTPUT:

DECLARE @MyNewIdentityValues tabla(myidvalues int)
declare @A tabla (id. int clave principal)
insertar en @A valores (1)
declare @B tabla (Id. int identidad de clave principal(1,1), B int not null)
insertar en @B valores (1)
seleccionar
    [RowCount] = @@RowCount,
    [@@IDENTITY] = @@IDENTITY,
    [SCOPE_IDENTITY] = SCOPE_IDENTITY()

establecer el perfil de estadísticas en
insertar en _ddr_T
salida inserted.ID en @MyNewIdentityValues
    seleccionar
            
b.ID         desde @A una
            combinación izquierda @B b en b.ID = 1
            combinación izquierda @B b2 en b2. B = -1

            combinación izquierda _ddr_T t en t.T = -1

        donde no existe (selecciona * de _ddr_T t2 donde t2.ID = -1)
establecer el perfil de estadísticas desactivado

seleccionar
    [RowCount] = @@RowCount,
    [@@IDENTITY] = @@IDENTITY,
    [SCOPE_IDENTITY] = SCOPE_IDENTITY(),
    [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T')
selecciona * en @MyNewIdentityValues
ir

Si su situación requiere que tenga que usar cualquiera de estas funciones, puede usar uno de los siguientes métodos para solucionar el problema.

Método 1:

Incluir la siguiente opción en la consulta

OPCIÓN (MAXDOP 1)

Nota:Esto puede dañar el rendimiento de la parte SELECT de la consulta.

Método 2:

Lea el valor de la parte SELECT en un conjunto de variables (o una sola variable de tabla) y, a continuación, insértese en la tabla de destino con MAXDOP=1. Puesto que el plan INSERTAR no será paralelo, recibirá la semántica adecuada, pero su SELECT será paralelo para lograr el rendimiento deseado.

Método 3:

Ejecute la instrucción siguiente para establecer el grado máximo de paralelismo en 1:

sp_configure "grado máximo de paralelismo", 1

ir

reconfigurar con invalidación

ir

Nota:Este método puede causar degradación del rendimiento en el servidor. No debe usar este método a menos que lo haya evaluado en un entorno de pruebas o ensayos.

Más información

Error de Microsoft Connect en este problema

Grado máximo de paralelismo (MAXDOP)https://msdn.microsoft.com/en-us/library/ms181007.aspx

¿Necesita más ayuda?

Ampliar sus conocimientos
Explorar los cursos
Obtener nuevas características primero
Unirse a Microsoft Insider

¿Le ha sido útil esta información?

¿Cómo de satisfecho está con la calidad de la traducción?
¿Qué ha afectado a tu experiencia?

¡Gracias por sus comentarios!

×