sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server 2005 ROW_NUMBER() sin ORDEN POR

Puede evitar especificar un orden explícito de la siguiente manera:

INSERT dbo.TargetTable (ID, FIELD)
SELECT
   Row_Number() OVER (ORDER BY (SELECT 1))
      + Coalesce(
         (SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)),
         0
      ),
   FieldValue
FROM dbo.SourceTable
WHERE {somecondition};

Sin embargo, tenga en cuenta que es simplemente una forma de evitar especificar un pedido y NO garantiza que se preservará cualquier ordenamiento de datos original. Hay otros factores que pueden hacer que se ordene el resultado, como un ORDER BY en la consulta externa. Para comprender completamente esto, uno debe darse cuenta de que el concepto "no ordenado (de una manera particular)" no es lo mismo que "manteniendo el orden original" (¡que ESTÁ ordenado de una manera particular!). Creo que desde una perspectiva pura de base de datos relacional, este último concepto no existe , por definición (aunque puede haber implementaciones de bases de datos que violen esto, SQL Server no es una de ellas).

El motivo de las sugerencias de bloqueo es evitar el caso en que algún otro proceso se inserte usando el valor que planea usar, entre las partes de la consulta en ejecución.

Nota:Mucha gente usa (SELECT NULL) para sortear la restricción "no se permiten constantes en la cláusula ORDER BY de una función de ventana". Por alguna razón, prefiero 1 sobre NULL .

Además:creo que una columna de identidad es muy superior y debería usarse en su lugar. No es bueno para la concurrencia bloquear exclusivamente tablas enteras. Subestimación.