2016-10-26 5 views
1

그래서 이것은 프로 시저에 대해 충분히 알지 못하는 문제 일지 모르지만 최근에 일하는 정규적인 사건이므로 테이블의 Column을 업데이트하여 프로 시저를 만들려고합니다.테이블 변수 "@ 테이블"을 선언해야합니까?

우리는 이전 시스템에서 새 시스템으로의 전환 단계에 있기 때문에 이것은 함께 새 데이터베이스를 만들었 기 때문입니다. 이전 데이터베이스에서는 nvarchar nchar을 사용 했으므로 문자에 대해 모든 슬롯을 사용하지 않아도 나머지 슬롯에는 공백이 채워집니다. 새 데이터베이스에서는 varchar를 사용하기 때문에 공백을 없애고 싶습니다!

그래서이 아주 편리합니다 :

USE omitted 
GO 
CREATE PROCEDURE TrimTrailingSpaces 
    @table VARCHAR(50), 
    @column VARCHAR(50) 
AS 
BEGIN 
UPDATE @table 
SET 
    @column = LTRIM(RTRIM(@column)); 
END 
GO 

하지만 시도 언제 우리가 한 동안 한 번 사용할 필요로

UPDATE table SET column = LTRIM(RTRIM(column)); 

그래서 나는 그것의 프로 시저를 만들려고 이것을 실행하십시오. 오류가 발생합니다 :

Msg 1087, Level 16, State 1, Procedure TrimTrailingSpaces, Line 6 [Batch Start Line 2]: Must declare the table variable "@table".

내가 뭘하고 있는거야?

+0

저장 프로 시저를 어떻게 실행합니까? – rbr94

+0

@MitchWheat 글쎄 왜 우리가 그 공백을 추가하지 않을 때 데이터베이스가 공백을 일관되게 가지고 있는지 설명하십시오. – OmniOwl

+0

@ rbr94 쿼리에서 볼 수 있듯이 나는 단순히 프로 시저를 만들려고 노력하고 있으며, 그렇게하지 않을 것입니다. – OmniOwl

답변

5
USE omitted 
GO 
CREATE PROCEDURE TrimTrailingSpaces 
    @table_name VARCHAR(50), 
    @column_name VARCHAR(50) 
AS 
BEGIN 
declare @sql varchar(200); 
set @sql='UPDATE ' + QUOTENAME(@table_name) 
    +' SET '+ @column_name+ ' = LTRIM(RTRIM(' + QUOTENAME(@column_name) +'))'; 
END 
GO 

동적 SQL을 사용해야합니다. UPDATE 쿼리에서 테이블 이름을 변수로 지정할 수 없습니다. 또한 SQL의 키워드 이외의 변수 이름으로 변경하십시오.

+0

동적 SQL을 생성 할 때 [sql injection] (https://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx)을 알아야합니다. [QuoteName] (https://msdn.microsoft.com/en-us/library/ms176114.aspx)은 공격의 가능성을 줄이는 데 도움이 될 수 있습니다. 예제 :'SET @sql = 'UPDATE'+ QUOTENAME (@ 테이블 이름) + 'SET ...'. –

+0

알겠습니다. 감사합니다. – OmniOwl

+0

@ destination-data 귀하의 제안에 감사드립니다. 내 대답을 수정하여 수정했습니다. –

관련 문제