2014-12-08 4 views
0
ALTER PROCEDURE [dbo].[spc_UpdateProductPDFCase] 
    @ProdId int, 
    @ProdModifiedDate DateTime, 
    @ProdModifiedBy nvarchar(50) ='', 
    @ColumnInput nvarchar(MAX), 
    @File nvarchar(50) 
AS 
BEGIN 
    UPDATE Product 
    SET 
     ProdModifiedBy = @ProdModifiedBy, 
     ProdModifiedDate = @ProdModifiedDate 
    WHERE ProductID = @ProdId 

    --Split up for troubleshooting 
    Declare @sql nvarchar(max) 

    SET @sql = 'UPDATE Product 
       SET ' 
        + @ColumnInput + ' = ' + @File + 
       ' WHERE ProductID = ' + cast(@ProdId AS nvarchar(max)) 

    execute sp_executesql @sql 
END 

내부 사이트의 관리자 패널에있는 4 개의 PDF 업 로더에 대한 업데이트 설명입니다. 사이트에서이 저장 프로 시저 1 열 이름 (@ColumnInput)과 파일 이름 (예 : Filename.pdf (@File))을 전달합니다. 업로드를 테스트 할 때 파일을 바인딩 할 수 없다는 오류가 표시됩니다.SQL - 다중 부분 식별자 "LargerPDFTest.pdf"를 바인딩 할 수 없습니다.

"LargerPDFTest.pdf"라는 멀티 파트 식별자를 바인딩 할 수 없습니다.

내가 선호하는 것은 동적 SQL을 사용하지 않고 업데이트를 수행하는 것이지만 다른 사례 (예 : 사례 명세서)와도 관련이 없습니다.

편집 : 문제 해결을 위해 여기에 2 개의 진술 만 있습니다. 내가 가지고있는 문제를 해결하면 나는 결국 두 가지를 결합하게 될 것이다.

+0

@ColumnInput 매개 변수의 값은 무엇입니까? – HaveNoDisplayName

+0

@ColumnInput은 열의 이름입니다.이 경우 열리는 업 로더에 따라 "ProdOptV12", "ProdOptV13", "ProdOptV14"또는 "ProdOptV15"로 전달됩니다. 나는 여전히 문자열을 전달하는 것이 문제인지 확실하지 않았기 때문에 SQL을 배우고있다. – Barix9

+0

왜 매개 변수로 업데이트 할 열을 전달하고 있습니까? 이것은 SQL 주입 공격에 대해 열려 있습니다. –

답변

0

여기가 더 안전하게하는 방법입니다. 그것은 여전히 ​​동적 SQL을 사용하고 있지만 값은 이제 매개 변수화되어 있습니다.

SET @sql = 'UPDATE Product 
SET ' + QUOTENAME(@ColumnInput) + ' = @File 
WHERE ProductID = @ProdId' 

EXEC sp_executesql @sql, N'@File nvarchar(50), @ProdID int', @File = @File, @ProdID = @ProdID 
+0

잠시 후에 다시 시도해 보겠습니다. 더 안전한 옵션을 설정하지 않으셔도됩니다. – Barix9

+0

그 것처럼 보입니다. 고맙습니다! – Barix9

관련 문제