복붙노트

[SQL] SQL Server 2005의 ROW_NUMBER () ORDER BY없이

SQL

SQL Server 2005의 ROW_NUMBER () ORDER BY없이

나는 다른 사용으로 하나 개의 테이블에서 삽입을 시도하고있다

DECLARE @IDOffset int;
SELECT @IDOffset = MAX(ISNULL(ID,0)) FROM TargetTable

INSERT INTO TargetTable(ID, FIELD)
SELECT [Increment] + @IDOffset ,FeildValue
FROM SourceTable
WHERE [somecondition]

TargetTable.ID 내가 자동 증가에 식으로 자신을 찾아야 할 이유 ID 열이 아니다.

나는로 ... 선택 내 삽입에서 사용 후, 그것을 채울 커서를 사용하거나 식별 컬럼과 fieldValue의 필드와 테이블 변수를 만들 수 있습니다 알고 있지만, 그것은 매우 효율적이지 않습니다. 내가 증가에 ROW_NUMBER 함수를 사용하여 시도,하지만 난 정말 내가 사용할 수있는 SourceTable에 필드에 의해 합법적 ORDER를 가지고 있지 않으며, SourceTable의 원래 순서를 (가능한 경우) 계속하고 싶습니다.

사람이 무엇을 제안 할 수 있습니까?

해결법

  1. ==============================

    1.다음과 같이 명시 적으로 순서를 지정 피할 수 있습니다 :

    다음과 같이 명시 적으로 순서를 지정 피할 수 있습니다 :

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

    그러나, 제발 단지 순서를 지정하지 않도록하는 방법입니다 및 원본 데이터의 순서가 보존 될 것이라는 점을 보장하지 않습니다. 같은 외부 쿼리에서 BY 순서로 정렬 할 수있는 결과를 일으킬 수있는 다른 요인이있다. 이것을 완전히 이해하기 위해서, 하나는 개념 "하지 (특정 방식) 주문은" "원래 순서 유지"와 같은 아니라는 것을 깨달아야한다 (특정 방식으로 주문입니다!). 나는 (이 위반 데이터베이스 구현있을 수 있지만, SQL 서버는 그 중 하나가 아닌) 순수한 관계형 데이터베이스 관점에서, 후자의 개념 정의에 의해, 존재하지 않는다고 생각합니다.

    잠금 힌트 이유는 값을 사용하여 다른 프로세스를 삽입하면 실행 쿼리의 부분 사이에 사용하려는 경우를 방지하는 것입니다.

    참고 : 많은 사람들이 제한은 "윈도 기능의 ORDER BY 절에 사용할 수없는 상수를"주위 얻을하는 (SELECT NULL)를 사용합니다. 어떤 이유로, 나는 NULL을 통해 1을 선호합니다.

    또한 : 나는 ID 열이 훨씬 우수하고 대신 사용한다고 생각합니다. 그것은 독점적으로 동시성에 대한 좋지 않다는 전체 테이블을 잠급니다. 삼가.

  2. ==============================

    2.이 같은 (선택 널 (null))에 의해 순서를 사용하여 순서를 무시할 수 있습니다 :

    이 같은 (선택 널 (null))에 의해 순서를 사용하여 순서를 무시할 수 있습니다 :

    declare @IDOffset int;
    select  @IDOffset = max(isnull(ID, 0)) from TargetTable
    
    insert  into TargetTable(ID, FIELD)
    select  row_number() over (order by (select null)) + @IDOffset, FeildValue
      from  SourceTable
     where  [somecondition]
    
  3. from https://stackoverflow.com/questions/4810627/sql-server-2005-row-number-without-order-by by cc-by-sa and MIT license