모든 행을 반환하는 SELECT TOP에 사용할 수있는 값이 있습니까?


13

최종 사용자가 쿼리 (SELECT TOP (@x))에 의해 반환되는 행 수를 정의 할 수 있습니다. 모든 행이 리턴되는 위치에 입력 할 수있는 값이 있습니까? 또는 모든 행을 반환하려면 TOP (@x)없이 동적으로 쿼리를 만들어야합니까?

SQL Server 2012를 사용하고 있습니다.


그것은인가 TOP ... ORDER BY뭔가? 는 IS ORDER BY뭔가 아직도 당신이 모두 선택하는 경우에 필요?
Martin Smith

1
내 생각 엔 .. 생략 만해도 문제가 아닌 것 같아 TOP? 미리 정의 된 쿼리를 처리하고 무언가 를 전달 해야하는 것처럼 ?
corsiKa

답변:


17

글쎄, 그것은 본다 TOP은 A는 BIGINT 당신이 사용하지 않는 경우 PERCENT를 . 즉 , BIGINT 의 최대 값을 전달할 수 있습니다 .

SELECT TOP (9223372036854775807) * FROM table1

나는 당신이 그 큰 테이블을 보게 될 것을 정말로 의심합니다. 쿼리 계획에 어떤 영향을 줄지 잘 모르겠습니다.


7
변수 @x가 BIGINT 라고 가정하면 SET @x = 0x7fffffffffffffff일부는 더 명확 할 수 있습니다. 어쨌든 기억하기가 더 쉽습니다.
Martin Smith

@MartinSmith 나는 솔직히 말해서 어느 쪽이든 찾아 볼 것이다. 암묵적인 전환입니까?
케네스 피셔

7
글로 시작하는 것을 기억 7하고 나머지 F는 8 바이트에 대해 총 16 문자가 필요하다는 것을 기억하는 것이 더 쉽습니다 . 그리고 예, 해당 데이터 유형의 변수에 할당하면 암시 적으로 변환됩니다.
Martin Smith

@MartinSmith 값의 이진 표현에 의존하는 것이 좋은 습관입니까? 문서는 상태 값의 이진 표현은 SQL 서버의 버전으로 버전에서 변경 될 수 있습니다 . 또한 SqlServer에서 0x7fffffffffffffffmax 값의 표현으로 인해 항상 혼란스러워했던 유일한 사람인지는 알 수 없습니다 bigint. 그 이유는 SqlServer 이진 상수 표기법 7f에서 가장 낮은 바이트를 가지고 있기 때문입니다. c ++와 같은 언어에서와 같이 부호있는 정수 유형의 최대 값을 얻기 위해 가장 높은 바이트를 갖습니다 .
i-one

3
@ i-one. 정수 유형의 이진 표현은 거의 변경되지 않습니다. 정수 형식에서 작동하는 비트 연산자를 제공하는 SQL Server에는 특정 형식에 의존 할 것으로 예상되지 않으면 아무 의미가 없습니다.
Martin Smith

12

당신은 또한 고려할 수 있습니다

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

대신에

SELECT TOP (@x) Foo
FROM Bar 
ORDER BY Baz;

@x를 설정해야하는 값은 0비활성화하는 것입니다.

데이터 수정 명령문에는 더 이상 사용되지 않지만에 대해서는 더 이상 사용되지 않습니다 SELECT.

2012 년에는 ROWCOUNT0과 0이 아닌 일부 값 의 경우 다른 계획이 컴파일됩니다 .

는 경우 ORDER BY Baz받는 의미를 부여 만이 TOP결과에 대한 프리젠 테이션 순서를 제공하기보다는 당신은 인덱스가에서 불필요한 종류의 피할 것이다 두 쿼리에이 다음 분할을 지원하지 않는 0경우.


8

SELECT TOP 100 PERCENT를 사용하면 쿼리에서 "TOP"을 사용할 때 발생하는 모든 오류를 무시할 수 있습니다.


1
나에게 그것은 실제로 최적화 된 기능을 사용해야하는 이유를 설명하지 않습니다. Crystal Reports 는 ORDER BY가 뷰 정의에있을 것으로 예상 합니까 ?
Andriy M

아니요. Crystal Reports는 쿼리를 보류하고 자체 실행 계획을 강제 실행하여 매우 비효율적이며 때로는 부정확 한 문제가 있습니다. SQL 쿼리에서 모든 논리와 디자인을 수행하고 Crystal에서 "예쁘게"만드는 것을 선호합니다. 그렇기 때문에 대부분 SSIS / SSRS로 마이그레이션했지만 여전히 레거시 보고서가 있습니다.
MguerraTorres

-2
select top(SELECT COUNT(*) FROM YourTable) * From YourTable

1
문제는 TOP 절의 매개 변수 에 관한 것 입니다. OP에는 이미 매개 변수 ( @x)가 있으며 이제 @x실제로 테이블에 몇 개의 행이 있는지에 관계없이 "모든 행"을 의미하도록 전달할 값을 묻고 있습니다. OP의 요구 사항에 맞게 솔루션을 조정하는 방법을 알아낼 수 있습니다.
Andriy M

1
작성된대로 행이 동시에 삽입되면 경쟁 조건이 있지만 질문에 맞게 조정했습니다. 이를 위해서는 동시 삽입을 차단하는 기간 동안 테이블 잠금이 필요합니다. 처음부터 체크인하는 데 드는 추가 비용은 많은 수를 사용하면 피할 수 있습니다.
Martin Smith

(SELECT COUNT(*) FROM YourTable)값이 아닙니다.
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.