我有一个要求,我必须用新的数据库名称替换动态sql中的数据库名称。
之类的东西select * from DBName.TableName
需要转换为
select * from newDBName.TableName
-
select * from [DbName.TableName]
需要转换为
select * from [NewDbName.TableName]
答案 0 :(得分:0)
简单的String.Replace可能无法解决您的问题,因为搜索文本可能出现在您不希望更改的其他地方。
执行此类转换的安全方法是解析SQL语句并执行上下文替换。
答案 1 :(得分:0)
这可以说是正则表达式的一个很好的用例。我建议采用以下简约模式:
(?i)\bDbname\b
这里的想法是在任何情况下使用单词边界\b
和内联(?i)
不区分大小写的修饰符来匹配字符串。
更复杂的模式可能如下所示:
(?i)(?<=\[|\b)DBNAME(?=\b|\])
为了更严格,我们可以添加一个额外的前锚,例如FROM
(?<=FROM\s+\[?)Dbname(?=\..+?\]?\b)
<强>解释强>:
(?<=FROM\s+\[?)
使用关键字FROM
作为主播,使用一个或多个空白\s
字符,然后选择]
Dbname
有问题的文字字符串(?=\..+?\]?\b)
一个积极的前瞻,跨越表名直到下一个单词边界\b
出现我使用lookarounds因为他们没有提供匹配结果$0
。这使其易于替换。
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(?<=FROM\s+\[?)(Dbname)(?=\..+?\]?)";
string substitution = @"newDbName";
string input = @"select * from DBName.TableName
select * from [DbName.TableName]";
RegexOptions options = RegexOptions.Multiline | RegexOptions.IgnoreCase;
Regex regex = new Regex(pattern, options);
string result = regex.Replace(input, substitution);
}
}