복붙노트

[SQL] 테이블 반환 함수 - 출력에 무시로 주문

SQL

테이블 반환 함수 - 출력에 무시로 주문

우리는 SQL 서버 2012 SQL 서버 2008에서 이동하는 즉시 모든 테이블 반환 함수가 더 이상 올바르게 정렬 된 순서로 자신의 임시 테이블의 내용을 전달 없다는 것을 알게된다.

암호:

INSERT INTO @Customer
        SELECT Customer_ID, Name,
        CASE 
            WHEN Expiry_Date < GETDATE() then 1 
            WHEN Expired = 1 then 1 
            ELSE 0
            END
        from Customer **order by Name**

SQL Server 2008에서는이 기능을 이름으로 분류 고객을 반환합니다. SQL 서버 2012 년은 정렬되지 않은 테이블을 반환합니다. 은 "에 의해 순서는"SQL 2012에서 무시됩니다.

우리는 sort_id를 포함하는 다시 쓰기로 모든 기능을 가지고 다음 종류의 그들 그들이 기본 응용 프로그램에서 호출 될 때 또는 쉬운 수정이 있나요?

해결법

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

    1.원래 접근 문제 두 가지가 있었다.

    원래 접근 문제 두 가지가 있었다.

    행동이 항목 1에 대한 변경하지만 그것은 지금 일반적으로 INSERT에 대한 소스 인 SELECT 문에 BY 순서가 무시로 2012 년이 보인다

    DECLARE @T TABLE(number int)
    
    INSERT INTO @T 
    SELECT number
    FROM master..spt_values
    ORDER BY name
    

    행동의 변화에 ​​대한 이유는 이전 버전의 SQL 서버가 정렬 연산자는 계획이었다 경우 정확한 의미를가 보장하는 것이었다 SET ROWCOUNT 0 (해제) 및 SET ROWCOUNT N.와 실행 사이에 공유 된 하나 개의 계획을 생산한다는 것입니다 0이 아닌 ROWCOUNT 세트와 함께 세션에 의해 실행합니다. 바로 왼쪽의 TOP 연산자는 ROWCOUNT TOP이다.

    계획의 ROWCOUNT 0 버전에 추가 할 필요가 없습니다 있도록 SQL 서버 2012은 이제 두 경우에 대해 별도의 계획을 생성합니다.

    선택 (SELECT)가 (TOP 100 PERCENT가 아닌) 정의 명시 적 TOP이있는 경우 일종의 여전히 2012 년 계획에 나타날 수 있지만 여전히 행의 실제 삽입 순서를 보장하지 않습니다, 다음 다른 종류가있을 수 있습니다 계획은 TOP N은 후 예를 들어 클러스터 된 인덱스 순서로 행을 얻기 위해 설립했다.

    그게 필요한 것입니다 경우 문제의 예를 들어 그냥 이름으로 순서를 지정하는 호출 코드를 조정합니다.

    이 할당되는 순서는 당신이 또한 할 수 있도록하여 주문에 따라 될 것 IDENTITY와 함께 테이블에 삽입 할 때이 보장 SQL Server의 주문 보장에서 sort_id 아이디어에 대해서

    DECLARE @Customer TABLE (
      Sort_Id     INT IDENTITY PRIMARY KEY,
      Customer_ID INT,
      Name        INT,
      Expired     BIT )
    
    INSERT INTO @Customer
    SELECT Customer_ID,
           Name,
           CASE
             WHEN Expiry_Date < Getdate() THEN 1
             WHEN Expired = 1 THEN 1
             ELSE 0
           END
    FROM   Customer
    ORDER  BY Name 
    

    그없이 보장 된 주문 (아마도이 ​​sort_id 접근 방식은 순서에 사용되는 원래 열이 테이블 변수로 복사되지 않는 경우에 유용 할 수 있습니다)이 없기 때문에하지만 당신은 여전히 ​​당신의 선택 쿼리에 sort_id로 주문해야

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

    2.@Customer 테이블에 rowno라는 이름의 열을 추가

    @Customer 테이블에 rowno라는 이름의 열을 추가

    INSERT INTO @Customer
    
    SELECT ROW_NUMBER()over(order by Name)rowno,Customer_ID, Name,
            CASE 
                WHEN Expiry_Date < GETDATE() then 1 
                WHEN Expired = 1 then 1 
                ELSE 0
                END
    from Customer 
    
  3. from https://stackoverflow.com/questions/11222043/table-valued-function-order-by-is-ignored-in-output by cc-by-sa and MIT license