2014-02-09 4 views
1

하나의 매개 변수로 저장 프로 시저를 만들려고합니다. 저장 프로 시저가 업데이트 쿼리를 수행하도록하고 실행될 때 전달하는 매개 변수를 업데이트해야하는 테이블로 지정합니다. 매개 변수를 사용하여 프로 시저를 만드는 데 실패했습니다.SQL Server 저장 프로 시저 매개 변수

CREATE PROCEDURE cleanq7 @tablename varchar(100) 
AS 
BEGIN 
    UPDATE @tablename 
    SET IMPOSSIBLE_CASE = '1' 
    WHERE q7='1' 
GO 

내가받은 메시지 나는 이것이 실행하면

Msg 102, Level 15, State 1, Procedure cleanq7, Line 6 
Incorrect syntax near '1'. 

내가 테스트 데이터베이스의 테이블에 그냥 들여 쓰기 업데이트 쿼리를 시도하고 예상대로 작용, 그래서 나는이 문제가되는 상상 저장 프로 시저를 선언하기위한 내 구문이 있습니다.

도움이 될 것입니다.

+0

나는 GO 대신 END를 가져야한다고 생각합니다. – Mihai

+0

QUOTENAME()을 사용하는 경우 UPTATE @ variable'이 허용되지 않으므로 동적 SQL을 사용해야합니다. –

답변

6
CREATE PROCEDURE cleanq7 
    @tablename NVARCHAR(128) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @Sql NVARCHAR(MAX); 

    SET @Sql = N'UPDATE ' + QUOTENAME(@tablename) + 
       N' SET IMPOSSIBLE_CASE = ''1'' 
        WHERE q7 = ''1''' 

    EXECUTE sp_executesql @Sql 
END 
GO 

당신은 당신이 동적으로 UPDATE 문을 작성하고 시스템 저장 프로 시저 sp_executesql를 사용하여 실행해야합니다 테이블 이름을 전달하고 있기 때문에.

문자열 이름으로 테이블 이름을 전달하면 SQL Server가 개체 이름이 아닌 문자열로 처리합니다. QUOTENAME() 함수를 사용하면 전달 된 테이블 이름 주위에 대괄호 ([])를 넣은 다음 SQL Server가이 이름을 개체 이름으로 처리합니다.

QuoteName 함수는 SQL 주입 공격으로부터 사용자를 보호 해줍니다.

+5

+1 – DeanOC

관련 문제