sql >> Databáze >  >> RDS >> Sqlserver

SQL Server 2005 ROW_NUMBER() bez ORDER BY

Můžete se vyhnout zadání explicitního pořadí následovně:

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

Upozorňujeme však, že jde pouze o způsob, jak se vyhnout zadávání objednávky a NEZARUČUJE že veškeré původní uspořádání dat bude zachováno. Existují další faktory, které mohou způsobit seřazení výsledku, například ORDER BY ve vnějším dotazu. Abychom tomu plně porozuměli, musíme si uvědomit, že pojem „neobjednáno (konkrétním způsobem)“ není totéž jako „zachovat původní pořadí“ (které JE nařízeno určitým způsobem!). Domnívám se, že z pohledu čistě relační databáze tento druhý koncept neexistuje , podle definice (ačkoli mohou existovat implementace databáze, které toto porušují, SQL Server mezi ně nepatří).

Důvodem tipů na zamykání je zabránit případu, kdy nějaký jiný proces vloží hodnotu, kterou plánujete použít, mezi části prováděného dotazu.

Poznámka:Mnoho lidí používá (SELECT NULL) obejít omezení "v klauzuli ORDER BY funkce oken nejsou povoleny žádné konstanty". Z nějakého důvodu preferuji 1 nad NULL .

Také:Myslím, že sloupec identity je mnohem lepší a měl by být použit místo něj. Pro souběžnost není dobré výhradně zamykat celé tabulky. Podhodnocení.



  1. Prohlášení FORALL s vázanou doložkou INDICES-OF v databázi Oracle

  2. Jak selhat nebo havarovat vaše instance MySQL pro testování

  3. Operátor

  4. Co je nového v MariaDB 10.4