Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server 2005 ROW_NUMBER() без ORDER BY

Можете да избегнете посочването на изрична подредба, както следва:

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};

Въпреки това, моля, имайте предвид, че това е само начин да избегнете посочването на поръчка и НЕ гарантира че всяко оригинално подреждане на данни ще бъде запазено. Има и други фактори, които могат да доведат до подреждане на резултата, като например ORDER BY във външната заявка. За да разберем напълно това, човек трябва да осъзнае, че понятието „не е подредено (по определен начин)“ не е същото като „запазване на оригиналния ред“ (което Е подредено по определен начин!). Вярвам, че от гледна точка на чиста релационна база данни, последното понятие не съществува , по дефиниция (въпреки че може да има реализации на база данни, които нарушават това, SQL Server не е един от тях).

Причината за подсказките за заключване е да се предотврати случай, когато някой друг процес се вмъкне, използвайки стойността, която планирате да използвате, между частите на изпълнението на заявката.

Забележка:Много хора използват (SELECT NULL) за да заобиколите ограничението "не са разрешени константи в клаузата ORDER BY на функция за прозорец". По някаква причина предпочитам 1 над NULL .

Също така:Мисля, че колоната за идентичност е много по-добра и трябва да се използва вместо това. Не е добре едновременността да заключва изключително цели таблици. Подценяване.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте цяло число в шестнадесетично и шестнадесетично в цяло число

  2. Променете формата на датата за текущата сесия в SQL Server

  3. Знайте как да възстановите изтрита таблица в SQL Server 2012 без архивиране

  4. Проста заявка за вземане на максимална стойност за всеки идентификатор

  5. Грешка при потвърждение на ръкостискане преди влизане в SQL Server