我正在查询由遗留应用程序分隔的两个dbs。当应用程序遇到像'ü',''','ó'这样的字符时,它们会被'?'取代。
所以为了匹配消息,我一直在使用一堆'替换'这样的调用:
(replace(replace(replace(replace(replace(replace(lower(substring([Content],1,153)) , '’', '?'),'ü','?'),'ó','?'), 'é','?'),'á','?'), 'ñ','?'))
超过几千条记录,这可能(正如您所料)非常慢。可能有更好的方法来做到这一点。谢谢你告诉我它是什么。
答案 0 :(得分:1)
您可以做的一件事是将RegEx Replace函数实现为SQL程序集,并将调用作为列上的用户定义函数而不是Replace()调用。可能会更快。您还希望在传入的查询值中使用相同的RegEx Replace。 TSQL Regular Expression
答案 1 :(得分:0)
为什么不首先使用正则表达式在应用程序端搜索的字符串上执行相同的替换(字符“?”)?例如。传递原始字符串以搜索和使用这些嵌套的replace()调用的SQL服务器查询将通过应用程序代码传递已包含“?”的搜索字符串。
答案 2 :(得分:0)
你可以在比较前将字符串转换为varbinary吗?如下所示:
declare
@Test varbinary (100)
,@Test2 varbinary (100)
select
@Test = convert(varbinary(100),'abcu')
,@Test2 = convert(varbinary(100),'abcü')
select
case
when @Test <> @Test2 then 'NO MATCH'
else 'MATCH'
end
答案 3 :(得分:0)
您可以在[Content]
列所在的同一个表上创建一个持久计算列。
或者,您可以使用StringBuilder
在C#中创建用户定义的函数来加速替换。您甚至可以将这两种解决方案结合起来。
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlString LegacyReplace(SqlString value)
{
if(value.IsNull) return value;
string s = value.Value;
int l = Math.Min(s.Length, 153);
var sb = new StringBuilder(s, 0, l, l);
sb.Replace('’', '?');
sb.Replace('ü', '?');
// etc...
return new SqlString(sb.ToString());
}