거대한 동적 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 문을 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니까?
나는이 일어나고 어디 생각하지 않습니다 - 그것은 밀접하게 읽기는 'SET를'중 하나입니다. 또한 myfield가 인덱싱 된 경우 인덱스가 효율적으로 사용될 수 없기 때문에 성능이 저하 될 것입니다 ... –
다시 읽는 것으로 나타났습니다. 대답을 편집했습니다. – Andomar