복붙노트

[SQL] sp_executesql에 차이 대 저장 프로 시저의 EXEC?

SQL

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

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

    2.사용 외에, 몇 가지 중요한 차이점이 있습니다 :

    사용 외에, 몇 가지 중요한 차이점이 있습니다 :

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

    3.sp_executesql에, 당신은 같은 쿼리를 구축 할 필요가 없습니다. 이처럼 선언 할 수 :

    sp_executesql에, 당신은 같은 쿼리를 구축 할 필요가 없습니다. 이처럼 선언 할 수 :

    DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + 
    @TableName + ' where Status=@eStatus'
    

    이 방법은 당신의 @status 값이 사용자로부터 온 경우 @eStatus를 사용하고 '탈출에 대해 걱정할 필요가 없습니다. sp_executesql을 당신에게 대신 연결을 사용하는 캐릭터 라인 형식의 쿼리에 변수를 넣을 수있는 기능을 제공합니다. 당신이 걱정 덜이 그래서.

    열 및 테이블 변수는 여전히 동일하지만, 그 사용자로부터 직접적으로 덜 가능성이 높습니다.

  4. ==============================

    4.Exec을 사용하여 당신은 당신의 T-SQL 문 문자열에있는 장소 홀더를 가질 수 없습니다.

    Exec을 사용하여 당신은 당신의 T-SQL 문 문자열에있는 장소 홀더를 가질 수 없습니다.

    sp_executesql을 장소 홀더를 가진 당신에게 이점을 제공하고 런타임에 실제 값을 전달

  5. from https://stackoverflow.com/questions/14722201/stored-procedure-exec-vs-sp-executesql-difference by cc-by-sa and MIT license