[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에 대한 변경하지만 그것은 지금 일반적으로 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.@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
from https://stackoverflow.com/questions/11222043/table-valued-function-order-by-is-ignored-in-output by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오류 : 하나 개 이상의 수익률 쿼리에 대해 TypedQuery를 만들 수 없습니다 (0) | 2020.06.08 |
---|---|
[SQL] 당신은 어떻게 백업 할 수와 같은 서버에 복사본으로 데이터베이스를 복원? (0) | 2020.06.08 |
[SQL] SQL 오류 : 골재의 오용 (0) | 2020.06.07 |
[SQL] 왜 오라클 SQL은 우리가 GROUP BY 절에 열 별칭을 사용하는 것을 허용하지 않습니다? (0) | 2020.06.07 |
[SQL] MySQL의 와일드 카드 * 및 % (0) | 2020.06.07 |