2009-11-13 1 views
0

Я рефакторинг огромного динамического оператора SQL и думаю, что, возможно, я попал в блокпост. Цель заключалась в параметризации. Я использую SQL Server 2005.Параметрирование динамической ошибки SQL с использованием типа данных SQL_VARIANT

У меня есть переменная 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 для запуска этого запроса .

я могу обойти эту проблему, если я могу как-то бросить @updateValue в правильный тип, который я хранится в виде текста в @updateClauseDataType. Есть ли способ, которым я могу это сделать, без огромного оператора if, который запрашивает значение @updateClauseDataType?

ответ

1

При перечитывании, поскольку вы уже знаете тип данных, почему бы не включить его в предложение обновления?

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

Или не вводить тип данных дважды:

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

Я не думаю, что это, где это происходит в - это в одном из «НАБОРЫ», чтение близко. Кроме того, если myfield индексируется, это будет работать с ошибкой, так как индексы не могут эффективно использоваться ... –

+0

Да, я заметил, что при перечитывании я отредактировал ответ – Andomar