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