我正在尝试标准化表 ABC 中的列值。如果字符串中与 STANDARD_VALUE_TABLE表中的INVALID列值匹配的部分,则要替换相应的有效值。
标准化表有大约400个值,因此根据我的下面的过程,检查来自ABC的每个col_value 400次以替换无效值,之后1个更新语句运行一个col_value。
这适用于我,但需要的时间超过预期。 21K记录大约需要30分钟。
有人可以提出另一种方法来改善表现吗?
set updated_col_value_v ='' DECLARE COL_VALUE_CURSOR CURSOR for select col_value from ABC fetch next from COL_VALUE_CURSOR into @Col_value_variable while @@FETCH_STATUS = 0 begin DECLARE Fuzzy_invalid_value_cursor CURSOR FOR SELECT INVALID_VALUES FROM STANDARD_VALUE_TABLE fetch next from Fuzzy_invalid_value_cursor into @invalid_value_variable WHILE @@FETCH_STATUS = 0 Begin select @Char_to_replace = VALID_VALUES from STANDARD_VALUE_TABLE where INVALID_VALUES=@invalid_value_variable if @updated_col_value_v='' set @replaced_value = replace(@Col_value_variable,@invalid_value_variable,@Char_to_replace) else set @replaced_value = replace(@updated_col_value_v,@invalid_value_variable,@Char_to_replace) set @updated_col_value_v = @replaced_value fetch next from Fuzzy_invalid_value_cursor into @invalid_value_variable end update ABC set updated_col_value=@updated_col_value_v where col_value=@Col_value_variable close Fuzzy_invalid_value_cursor deallocate Fuzzy_invalid_value_cursor fetch next from COL_VALUE_CURSOR into @Col_value_variable End close COL_VALUE_CURSOR deallocate COL_VALUE_CURSOR
答案 0 :(得分:1)
我会尝试摆脱外部光标。不是一次更新一行,而是全部400次替换,而是每次替换一次,并更新所有需要它的行。您的无效值表有多安全?如果你不需要担心sql注入,我会在Fuzzy_Invalid-Value_Cursor中使用类似下面的东西 - 你只是更新具有特定无效值的行,但是你要做所有这些行立刻。是的,您可能会多次更新某些行,但您可能也会完全跳过其中一些行,这取决于数据,而您只是对实际需要它的行执行替换功能。
Update ABC Set Col_Value = replace(Col_Value,@invalid_value_variable,@Char_to_replace)
Where Col_Value like '%' + @invalid_value_variable + '%'