[SQL] sp_executesql에 차이 대 저장 프로 시저의 EXEC?
SQLsp_executesql에 차이 대 저장 프로 시저의 EXEC?
나는 sp_executesql을 두 개의 저장 프로 시저를 작성했습니다 및 기타 sp_executesql을하고 있지 않습니다 둘 다 제대로 동일한 결과를 실행하는, 나는 차이가 사이에 여기에 무엇을하지 않았다
그리고 어떻게 EXEC (@SQL는) ... SQL 주입 및 sp_executesql을 @SQL하는 경향이 그렇지?
다음은 sp_executesql을하지 않고 저장 프로 시저
ALTER proc USP_GetEmpByStatus
(
@Status varchar(12)
)
AS
BEGIN
DECLARE @TableName AS sysname = 'Employee'
Declare @Columns as sysname = '*'
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39)
print (@SQL)
EXEC (@SQL)
END
EXEC USP_GetEmpByStatus 'Active'
sp_executesql을 가진 저장 프로 시저 아래
create proc USP_GetEmpByStatusWithSpExcute
(
@Status varchar(12)
)
AS
BEGIN
DECLARE @TableName AS sysname = 'JProCo.dbo.Employee'
Declare @Columns as sysname = '*'
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39)
print @SQL
exec sp_executesql @SQL, N'@eStatus varchar(12)', @eStatus = @Status
END
EXEC USP_GetEmpByStatusWithSpExcute 'Active'
해결법
-
==============================
1.귀하의 sp_executesql을의 SQL은 아마이어야한다;
귀하의 sp_executesql을의 SQL은 아마이어야한다;
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=@eStatus'
이것은 당신이 SQL로를 내장하는 대신 매개 변수로 @eStatus와 sp_executesql을 호출 할 수 있습니다. 즉 @eStatus는 모든 문자를 포함 할 수 있다는 이점을 줄 것이다 및 안전에 필요한 경우 제대로 데이터베이스에 의해 자동으로 이스케이프됩니다.
대비 EXEC에 필요한 SQL에 그;
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39)
... @status에 포함 된 CHAR (39) 사용자의 SQL의 잘못을하고 아마도 SQL 주입 가능성을 만드는 곳. @status가 오라일리로 설정되어있는 경우 예를 들어, 당신의 결과 SQL이 될 것이다;
select acol,bcol,ccol FROM myTable WHERE Status='O'Reilly'
-
==============================
2.사용 외에, 몇 가지 중요한 차이점이 있습니다 :
사용 외에, 몇 가지 중요한 차이점이 있습니다 :
-
==============================
3.sp_executesql에, 당신은 같은 쿼리를 구축 할 필요가 없습니다. 이처럼 선언 할 수 :
sp_executesql에, 당신은 같은 쿼리를 구축 할 필요가 없습니다. 이처럼 선언 할 수 :
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=@eStatus'
이 방법은 당신의 @status 값이 사용자로부터 온 경우 @eStatus를 사용하고 '탈출에 대해 걱정할 필요가 없습니다. sp_executesql을 당신에게 대신 연결을 사용하는 캐릭터 라인 형식의 쿼리에 변수를 넣을 수있는 기능을 제공합니다. 당신이 걱정 덜이 그래서.
열 및 테이블 변수는 여전히 동일하지만, 그 사용자로부터 직접적으로 덜 가능성이 높습니다.
-
==============================
4.Exec을 사용하여 당신은 당신의 T-SQL 문 문자열에있는 장소 홀더를 가질 수 없습니다.
Exec을 사용하여 당신은 당신의 T-SQL 문 문자열에있는 장소 홀더를 가질 수 없습니다.
sp_executesql을 장소 홀더를 가진 당신에게 이점을 제공하고 런타임에 실제 값을 전달
from https://stackoverflow.com/questions/14722201/stored-procedure-exec-vs-sp-executesql-difference by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] sp_executesql을 표와 변수를 사용하여 (0) | 2020.07.02 |
---|---|
[SQL] SQLite는의 IF () 문의 대안 (0) | 2020.07.02 |
[SQL] 하지 존재하는 경우 열을 추가 MYSQL (0) | 2020.07.02 |
[SQL] SQL Server 2008의 복합 외래 키 만들기 (0) | 2020.07.02 |
[SQL] 어떻게 jDBI에서의 쿼리 할까? (0) | 2020.07.02 |