[SQL] "주문은"열 이름에 대한 매개 변수를 사용하여
SQL"주문은"열 이름에 대한 매개 변수를 사용하여
우리는 쿼리 또는 Visual Studio를 데이터 집합 디자이너로 만든 저장 프로 시저의 "주문"절에 매개 변수를 사용하고 싶습니다.
예:
FROM TableName
WHERE (Forename LIKE '%' + @SearchValue + '%') OR
(Surname LIKE '%' + @SearchValue + '%') OR
(@SearchValue = 'ALL')
ORDER BY @OrderByColumn
이 오류가 표시됩니다
Variables are only allowed when ordering by an expression referencing
a column name.
해결법
-
==============================
1.당신이 뭔가를 할 수 있어야한다 :
당신이 뭔가를 할 수 있어야한다 :
SELECT * FROM TableName WHERE (Forename LIKE '%' + @SearchValue + '%') OR (Surname LIKE '%' + @SearchValue + '%') OR (@SearchValue = 'ALL') ORDER BY CASE @OrderByColumn WHEN 1 THEN Forename WHEN 2 THEN Surname END;
성능하지만주의해야합니다. 구조의 이러한 종류의 최적의 실행 계획을 찾기 위해 쿼리 최적화 프로그램의 기능을 방해 할 수 있습니다. 예를 들어, 뒤따라야가 인덱스에 포함 된 경우에도 쿼리는 여전히 순서로 인덱스를 가로 지르는 대신 전체 종류가 필요할 수 있습니다.
그건 당신이 성능에 미치는 영향과 함께 살 수없는 경우, 그리고 경우, 클라이언트 측 상당히 일을 복잡하게, 각각의 가능한 정렬 순서에 대한 쿼리의 별도의 버전을해야 할 수도 있습니다.
-
==============================
2.나는 늦게 스레드 방식에 간다 것을 알고 있지만 난 그냥 다른 비슷한 문제가있는 경우 사람이를 게시 할.
나는 늦게 스레드 방식에 간다 것을 알고 있지만 난 그냥 다른 비슷한 문제가있는 경우 사람이를 게시 할.
문제는 당신이 (등등 ... 두 번째의 첫 번째 필드 2, 1, 등) SQL 서버는 당신이 번호를 제공 할 것으로 예상하기 때문에, 매개 변수에 의해 직접 주문을 수행하려고 할 때 발생하는 것 같습니다, 또는 열 이름 식별자 (MyField 또는 "MyField") 또는 문자열 ( 'MyField')로 제시된 하나.
예를 들면 :
DECLARE @ORDERBY AS NVARCHAR(20) ; SELECT @ORDERBY = :Param1 --(Supposing that the user enters 'MyField') ; SELECT TOP 1 * FROM MyTable ORDER BY @ORDERBY DESC ;
다음과 같은 오류가 발생합니다 :
당신이 (식별자 또는 문자열을 사용)에 설명 된 방법 중 어느 하나에 수동으로 쿼리를 작성하는 경우, 오류가 없습니다.
SELECT TOP 1 * FROM MyTable ORDER BY MyField DESC ; SELECT TOP 1 * FROM MyTable ORDER BY "MyField" DESC ; SELECT TOP 1 * FROM MyTable ORDER BY 'MyField' DESC ;
이 같은 매개 변수에 CAST ()를 수행한다면, 그 값은 문자열로 변환, 쿼리가 성공적으로 실행 :
DECLARE @ORDERBY AS NVARCHAR(20) ; SELECT @ORDERBY = :Param1 --(Supposing that the user enters the text 'MyField') ; SELECT TOP 1 * FROM MyTable ORDER BY CAST(@ORDERBY AS NVARCHAR(20)) DESC ;
이 경우, (다시, 사용자의 값으로 문자열 'MyField'를 쓴 랬 : Param1을) 실행되는 실제 쿼리는 다음과 같습니다
SELECT TOP 1 * FROM MyTable ORDER BY 'MyField' DESC ;
이 쿼리는 잠재적으로 가능한 값의 수백 스트레칭 할 수있는 CASE 문에 가능한 사용자 입력을 모두 열거 할 필요없이, 아니 오류 및 성능에 뚜렷한 상당한 영향을 성공적으로 실행합니다.
나는 아무런 문제 2005 년까지에서 2016 년, 마이크로 소프트 SQL 서버에서이 솔루션을 여러 번 사용했습니다.
희망이 여전히 누군가에게 도움이 될 수 있습니다.
from https://stackoverflow.com/questions/13844678/order-by-using-a-parameter-for-the-column-name by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL은 - VARCHAR 컬럼에서 숫자 값만 선택 (0) | 2020.07.01 |
---|---|
[SQL] MySQL의에서 주소 IP 클라이언트를 검색 (0) | 2020.07.01 |
[SQL] 하나의 MySQL의 문에서 자르기 여러 테이블 (0) | 2020.07.01 |
[SQL] 임의의 사용자가보기에 모든 권한을 부여하는 방법 (0) | 2020.07.01 |
[SQL] 캔 PreparedStatement.addBatch ()는 SELECT 쿼리에 사용? (0) | 2020.07.01 |