2017-03-01 14 views
2

나는 SQL 서버의 쿼리를 다음, 값의 일부는 이전 계산 된 변수에 저장되어 있습니다 :

SET @Command = N'INSERT INTO Products (Id 
           ,Region 
           ,Name 
           ,Category 
           ,CreatedBy 
           ,CreatedOn 
           ,) SELECT ' + @Id + ', 
              Region, 
              ''' + @ProductName + ''', 
              Category, 
              CreatedBy, 
              CreatedOn FROM ' + @ProductTable + ' 
               WITH (NOLOCK) WHERE Id IS NOT NULL'; 

    EXEC(@Command) 

이 @ProductName의 값 경우를 제외하고 잘 실행 포함 따옴표 (예 : 짐의 제품)이 경우에 나는 다음과 같은 오류 얻을 :

이 같은 동적 쿼리에서 변수에 작은 따옴표를 처리하는 방법은 문자열 후 닫히지 않은 인용 부호를 거기 어디 선택한 값 중 하나가 삽입됩니다 (@Pr 이 경우 oductName)은 삽입을 위해 값을 검색해야하는 소스 테이블의 실제 컬럼 이름 대신 삽입되는 값입니까?

+0

여기에 동적 SQL 일을 할 절대적으로 필요하다? – Augwa

+0

어떤 데이터베이스를 사용하고 있습니까? – Utsav

+0

@Utsav : SQL Server. 메인 포스트도 업데이트되었습니다. – Cranialsurge

답변

3

EXEC 대신 sp_executesql을 사용하고 @ProductName 값에 적절한 매개 변수를 사용하는 것이 가장 좋습니다.

매개 변수화 할 수없는 나머지 쿼리 (테이블 이름 @ProductTable)는 동적 문자열 연결로 유지됩니다.

이 경우에는 아무 것도 이스케이프 할 필요가 없으며 SQL 삽입으로부터 보호됩니다. 이 같은

뭔가 :

SET @Command = 
    N'INSERT INTO Products 
     (Id 
     ,Region 
     ,Name 
     ,Category 
     ,CreatedBy 
     ,CreatedOn) 
    SELECT 
     @ParamId 
     ,Region 
     ,@ParamProductName 
     ,Category 
     ,CreatedBy 
     ,CreatedOn 
    FROM ' + @ProductTable + N' WITH (NOLOCK) 
    WHERE ID IS NOT NULL' 
    ; 

EXEC sp_executesql 
    @Command 
    ,N'@ParamId int, @ParamProductName nvarchar(255)' 
    ,@ParamId = @Id 
    ,@ParamProductName = @ProductName 
; 
+0

완벽하고 정확히 내가 필요로하는 것! 감사합니다 @ 블라디미르. – Cranialsurge