[SQL] 내가 저장 프로 시저에서 SELECT 문에서 변수를 사용하여 열 이름을 통과해야하지만 난 동적 쿼리를 사용할 수 없습니다
SQL내가 저장 프로 시저에서 SELECT 문에서 변수를 사용하여 열 이름을 통과해야하지만 난 동적 쿼리를 사용할 수 없습니다
여기 아래에있는 내 SQL 쿼리입니다. 나는 변수로 지정된 열 이름의 값을 선택합니다. 동적 쿼리를 사용 제외하고이 일을 적절한 방법이 있나요?
SELECT EPV.EmployeeCode, @RateOfEmployee, @RateOfEmployer
FROM [HR_EmployeeProvisions] EPV
해결법
-
==============================
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.당신은 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.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 컬럼 이름 =?를 추가 할 수 있습니다. 당신이 더 많은 열을 필요로하는 경우, 당신은 아마 다시 열 다시 값을 얻을 수있는 피벗보다 않은 피벗 테이블에 열 값을 필터링해야 할 것입니다.
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
'SQL' 카테고리의 다른 글
[SQL] SQL의 IN 절에 SQL 매개 변수에 문자열 배열을 전달하는 방법 (0) | 2020.05.17 |
---|---|
[SQL] 같은 테이블의 SQL 서버에서 행에 해당하는 선택 (0) | 2020.05.17 |
[SQL] 기본 키 값과 외래 키하지 채우기 (0) | 2020.05.17 |
[SQL] SELECT 유형의 쿼리는 해당이 중첩 될 수 있습니다 유형? (0) | 2020.05.17 |
[SQL] 결과 세트의 값을 반복하는 방송 블랭크 (0) | 2020.05.17 |