2009-11-13 5 views
0

거대한 동적 SQL 문을 리팩토링했으며로드 블록을 맞았을 것으로 생각합니다. 목표는 그것을 매개 변수화하는 것이 었습니다. SQL Server 2005를 사용하고 있습니다.SQL_VARIANT 데이터 유형을 사용하여 동적 SQL 문제 매개 변수

업데이트 할 항목을 결정하는 int 변수 (@i)가 있습니다. 여기에 내가 뭘했는지의 : 다음

if @i = 1 
begin 
    set @updateClause = 'Column1 = @newValue'; 
    set @updateClauseDataType = 'varchar(10)'; 
    set @updateValue = @foo;  
end 
else if @i = 2 
begin 
    set @updateClause = 'Column2 = @newValue'; 
    set @updateClauseDataType = 'int'; 
    set @updateValue = @bar;  
end 
else if ... 

, 내 문을 실행하려고 :

이 결과
set @statement = N'update ' + @server_name + '.' + @database_name + '.dbo.Table1 
    set ' + @updateClause + ' where pk = @pk'; 

set @parameters = '@newValue ' + @updateClauseDataType + ',  
@pk uniqueidentifier'; 


execute sp_executesql @statement, 
@parameters, 
@newValue = @newValue, 
@pk= @pk; 

:

데이터 형식에서

암시 적 변환 sql_variant를 VARCHAR로 허용되지 않습니다. CONVERT 함수를 사용하여 쿼리를 실행하십시오.

어떻게 든 내가 @updateClauseDataType에 텍스트로 저장 한 올바른 유형으로 @updateValue을 시전 할 수 있다면 나는이 문제를 얻을 수 있습니다. @updateClauseDataType의 값을 묻는 거대한 if 문을 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니까?

답변

1

데이터 유형을 이미 알고 있으므로 다시 읽는 중에 update 절에 포함시키지 않는 이유는 무엇입니까?

set @updateClause = 'Column1 = cast(@newValue as varchar(10))'; 
set @updateClauseDataType = 'varchar(10)'; 

또는 두 배의 데이터 형식을 입력 방지하려면 :

set @updateClauseDataType = 'varchar(10)'; 
set @updateClause = 'Column1 = cast(@newValue as ' + 
    @updateClauseDataType + ')'; 
+0

나는이 일어나고 어디 생각하지 않습니다 - 그것은 밀접하게 읽기는 'SET를'중 하나입니다. 또한 myfield가 인덱싱 된 경우 인덱스가 효율적으로 사용될 수 없기 때문에 성능이 저하 될 것입니다 ... –

+0

다시 읽는 것으로 나타났습니다. 대답을 편집했습니다. – Andomar

관련 문제