[SQL] 나는 SQL 저장 프로 시저에 입력 매개 변수로 열 이름을 전달할 수 있습니다
SQL나는 SQL 저장 프로 시저에 입력 매개 변수로 열 이름을 전달할 수 있습니다
create procedure sp_First
@columnname varchar
AS
begin
select @columnname from Table_1
end
exec sp_First 'sname'
내 요구 사항은 입력 매개 변수로 열 이름을 전달하는 것입니다. 나는 그런 시도했지만 잘못된 출력을했다.
도움말 나 그래서
해결법
-
==============================
1.당신은 몇 가지 방법으로이 작업을 수행 할 수 있습니다.
당신은 몇 가지 방법으로이 작업을 수행 할 수 있습니다.
하나는 쿼리를 직접 구축하고 실행하는 것입니다.
SET @sql = 'SELECT ' + @columnName + ' FROM yourTable' sp_executesql @sql
당신이 방법을 선택하는 경우, 귀하의 의견을 santise 매우 확신 할 수. 당신이 당신의 응용 프로그램은 '진짜'열 이름을 줄 것이다 알고있다하더라도, 직접 SP를 실행할 수 무엇을 보안의 일부-하나 발견 균열 여부와인가? 그런 다음 그들은 단지 그들이 원하는 무엇이든 실행할 수 있습니다. 동적 SQL로, 항상, 항상, 매개 변수를 확인합니다.
또는, CASE 문을 작성할 수 있습니다 ...
SELECT CASE @columnName WHEN 'Col1' THEN Col1 WHEN 'Col2' THEN Col2 ELSE NULL END as selectedColumn FROM yourTable
이것은 좀 더 긴 호흡이지만, 훨씬 더 안전합니다.
-
==============================
2.아뇨 그냥 매개 변수 값을 선택합니다. 당신은 동적 SQL을 사용해야합니다.
아뇨 그냥 매개 변수 값을 선택합니다. 당신은 동적 SQL을 사용해야합니다.
당신의 절차에서는 다음을 할 것이다 :
DECLARE @sql nvarchar(max) = 'SELECT ' + @columnname + ' FROM Table_1'; exec sp_executesql @sql, N''
-
==============================
3.동적 SQL을 사용해보십시오 :
동적 SQL을 사용해보십시오 :
create procedure sp_First @columnname varchar AS begin declare @sql nvarchar(4000); set @sql='select ['+@columnname+'] from Table_1'; exec sp_executesql @sql end go exec sp_First 'sname' go
-
==============================
4.이건 불가능 해. 사용 동적 SQL (위험) 또는 거대한 경우 식 (느린) 중 하나.
이건 불가능 해. 사용 동적 SQL (위험) 또는 거대한 경우 식 (느린) 중 하나.
-
==============================
5.당신은 열 이름을 전달할 수 있지만, 당신은 SQL 문을 같은에서 사용할 수 없습니다
당신은 열 이름을 전달할 수 있지만, 당신은 SQL 문을 같은에서 사용할 수 없습니다
Select @Columnname From Table
하나는 동적 SQL 문자열을 구축하고 EXEC처럼 실행할 수 있습니다 (@SQL)
자세한 내용은 동적 SQL에 대한이 답변을 참조하십시오.
동적 SQL 장단점
-
==============================
6.
Create PROCEDURE USP_S_NameAvilability (@Value VARCHAR(50)=null, @TableName VARCHAR(50)=null, @ColumnName VARCHAR(50)=null) AS BEGIN DECLARE @cmd AS NVARCHAR(max) SET @Value = ''''+@Value+ '''' SET @cmd = N'SELECT * FROM ' + @TableName + ' WHERE ' + @ColumnName + ' = ' + @Value EXEC(@cmd) END
내가 하나를 대답을 시도, 그것은 성공적으로 실행하지만,지고도 그 포기하지 않을 올바른 출력, 위의 작업을 실행하는 동안
-
==============================
7.MatBailie에서 언급 한 바와 같이 이 동적 쿼리하지 아플리케가 SQL 주입의 적은 기회이기 때문에이 훨씬 더 안전합니다. 당신도 절은 수 동적 원하는 내가 추가 한 상황. XX YY는 열 이름입니다
MatBailie에서 언급 한 바와 같이 이 동적 쿼리하지 아플리케가 SQL 주입의 적은 기회이기 때문에이 훨씬 더 안전합니다. 당신도 절은 수 동적 원하는 내가 추가 한 상황. XX YY는 열 이름입니다
CREATE PROCEDURE [dbo].[DASH_getTP_under_TP] ( @fromColumnName varchar(10) , @toColumnName varchar(10) , @ID varchar(10) ) as begin -- this is the column required for where clause declare @colname varchar(50) set @colname=case @fromUserType when 'XX' then 'XX' when 'YY' then 'YY' end select SelectedColumnId from ( select case @toColumnName when 'XX' then tablename.XX when 'YY' then tablename.YY end as SelectedColumnId, From tablename where (case @fromUserType when 'XX' then XX when 'YY' then YY end)= ISNULL(@ID , @colname) ) as tbl1 group by SelectedColumnId end
-
==============================
8.이것으로 시도하십시오. 나는 당신을 위해 작동 바랍니다.
이것으로 시도하십시오. 나는 당신을 위해 작동 바랍니다.
Create Procedure Test ( @Table VARCHAR(500), @Column VARCHAR(100), @Value VARCHAR(300) ) AS BEGIN DECLARE @sql nvarchar(1000) SET @sql = 'SELECT * FROM ' + @Table + ' WHERE ' + @Column + ' = ' + @Value --SELECT @sql exec (@sql) END -----execution---- /** Exec Test Products,IsDeposit,1 **/
from https://stackoverflow.com/questions/10092869/can-i-pass-column-name-as-input-parameter-in-sql-stored-procedure by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버로 가져 오기 CSV 파일 (0) | 2020.03.15 |
---|---|
[SQL] MS SQL 서버 - 지정된 이름을 가진 열을 포함하는 모든 테이블을 찾기 (0) | 2020.03.15 |
[SQL] PostgreSQL의 '분에 의해'쿼리에 대한 행의 수를 실행 (0) | 2020.03.15 |
[SQL] JDBC와 일괄 삽입 할 수있는 효율적인 방법 (0) | 2020.03.15 |
[SQL] 7 항목에 1000 6에서 SQL 서버 2012 열 신원 증가 점프 [중복] (0) | 2020.03.15 |