복붙노트

[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. ==============================

    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.나는 늦게 스레드 방식에 간다 것을 알고 있지만 난 그냥 다른 비슷한 문제가있는 경우 사람이를 게시 할.

    나는 늦게 스레드 방식에 간다 것을 알고 있지만 난 그냥 다른 비슷한 문제가있는 경우 사람이를 게시 할.

    문제는 당신이 (등등 ... 두 번째의 첫 번째 필드 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 서버에서이 솔루션을 여러 번 사용했습니다.

    희망이 여전히 누군가에게 도움이 될 수 있습니다.

  3. from https://stackoverflow.com/questions/13844678/order-by-using-a-parameter-for-the-column-name by cc-by-sa and MIT license