복붙노트

[SQL] 내가 저장 프로 시저에서 SELECT 문에서 변수를 사용하여 열 이름을 통과해야하지만 난 동적 쿼리를 사용할 수 없습니다

SQL

내가 저장 프로 시저에서 SELECT 문에서 변수를 사용하여 열 이름을 통과해야하지만 난 동적 쿼리를 사용할 수 없습니다

여기 아래에있는 내 SQL 쿼리입니다. 나는 변수로 지정된 열 이름의 값을 선택합니다. 동적 쿼리를 사용 제외하고이 일을 적절한 방법이 있나요?

SELECT EPV.EmployeeCode, @RateOfEmployee, @RateOfEmployer
FROM [HR_EmployeeProvisions] EPV

해결법

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

    1.한 가지 방법은 CASE 문을 사용하는 동적 SQL을 사용하지 않고이 작업을 수행하는

    한 가지 방법은 CASE 문을 사용하는 동적 SQL을 사용하지 않고이 작업을 수행하는

    하지만이 못생긴

    SELECT EPV.EmployeeCode, case @RateOfEmployee  when 'RateOfEmployee' then RateOfEmployee
    when 'X' then X 
    ..
    end , case @RateOfEmployer  when 'RateOfEmployer' then RateOfEmployer
    when 'Y' then Y
    ..
    end 
    FROM [HR_EmployeeProvisions] EPV
    

    당신은 CASE 문에 모든 열을 확인해야합니다.

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

    2.당신은 SQL Server의 식별자를 매개 변수화 할 수없고, 나는 그것이 다른 관계형 데이터베이스에 가능 의심한다.

    당신은 SQL Server의 식별자를 매개 변수화 할 수없고, 나는 그것이 다른 관계형 데이터베이스에 가능 의심한다.

    당신의 최선의 선택은 동적 SQL을 사용하는 것입니다.

    동적 SQL은 매우 자주 보안 위험이며 SQL 주입 공격으로부터 코드를 방어해야합니다.

    아마 이런 짓을 할 것이다 :

    Declare @Sql nvarchar(500)
    Declare numberOfColumns int;
    
    select @numberOfColumns = count(1)
    from information_schema.columns
    where table_name = 'HR_EmployeeProvisions'
    and column_name IN(@RateOfEmployee, @RateOfEmployer)
    
    if @numberOfColumns = 2 begin
    
    Select @Sql = 'SELECT EmployeeCode, '+ QUOTENAME(@RateOfEmployee) +' ,'+ QUOTENAME(@RateOfEmployer) +
    'FROM HR_EmployeeProvisions'
    
    exec(@Sql)
    end
    

    이 방법 당신은 열 이름이 실제로 안전의 다른 층으로 QUOTENAME을 사용뿐만 아니라, 테이블에 있는지 확인하십시오.

    참고 : 프리젠 테이션 계층에서 당신이 열 이름이 유효하기 때문에 선택 뜻을 수행하지 않도록 옵션을 처리해야합니다.

  3. ==============================

    3.UNPIVOT 절에서보세요 - 아니에요 확인은 귀하의 경우에 적용하지만, 어떤 상황에서 동적 SQL없이 열 이름 값을 조회 할 수 있습니다 :

    UNPIVOT 절에서보세요 - 아니에요 확인은 귀하의 경우에 적용하지만, 어떤 상황에서 동적 SQL없이 열 이름 값을 조회 할 수 있습니다 :

    create table t1 (
      a int,
      b int,
      c int
    );
    
    insert into t1 values
    (1, 11, 111),
    (2, 22, 222),
    (3, 33, 333);
    
    select a, col_name, col_value from t1
    unpivot (col_value for col_name in (b, c)) as dt;
    

    결과:

    | a | col_name | col_value |
    |---|----------|-----------|
    | 1 |        b |        11 |
    | 1 |        c |       111 |
    | 2 |        b |        22 |
    | 2 |        c |       222 |
    | 3 |        b |        33 |
    | 3 |        c |       333 |
    

    (SQL 바이올린)

    당신은 단지 (동적) 중 B 또는 C에 대한 몇 가지 조건에 따라의 값이 필요한 경우, 해당의 조건을 구축 할 수 있습니다. 당신이 열 B 또는 C 중 하나의 값이 필요하면 ... WHERE 컬럼 이름 =?를 추가 할 수 있습니다. 당신이 더 많은 열을 필요로하는 경우, 당신은 아마 다시 열 다시 값을 얻을 수있는 피벗보다 않은 피벗 테이블에 열 값을 필터링해야 할 것입니다.

  4. from https://stackoverflow.com/questions/36419576/i-need-to-pass-column-names-using-variable-in-select-statement-in-store-procedur by cc-by-sa and MIT license