有没有人试图动态地将标准sql字符串转换为参数化查询?换句话说,我需要改变这个:
SELECT * FROM customers WHERE name = 'Adams'
到此:
SELECT * FROM customers WHERE name = @name
我已经开始使用Microsoft.Data.Schema.ScriptDom.Sql和Microsoft.Data.Schema.ScriptDom程序集,但在我坚持下去之前,我想知道是否已经有了一些东西在野外这会做到这一点。
答案 0 :(得分:5)
SQL Server在幕后(以及ClearTrace等工具)执行此操作。
一种方法是使用正则表达式来规范化(不完全是你想要的),例如基于Itzik Ben-Gan完成的工作并由Adam Machanic修改的SQL CLR方法:
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)]
public static SqlString sqlsig(SqlString querystring)
{
return (SqlString)Regex.Replace(
querystring.Value,
@"([\s,(=<>!](?![^\]]+[\]]))(?:(?:(?:(?:(?# expression coming
)(?:([N])?(')(?:[^']'')*('))(?# character
)(?:0x[\da-fA-F]*)(?# binary
)(?:[-+]?(?:(?:[\d]*\.[\d]*[\d]+)(?# precise number
)(?:[eE]?[\d]*)))(?# imprecise number
)(?:[~]?[-+]?(?:[\d]+))(?# integer
)(?:[nN][uU][lL][lL])(?# null
))(?:[\s]?[\+\-\*\/\%\&\\^][\s]?)?)+(?# operators
)))",
@"$1$2$3#$4");
}
但输出的准确性可能无法捕获所有可能的参数短语。
我很好奇为什么你需要这个?
更新:正如马丁所说,还有RML Utilities for SQL Server
Description of the Replay Markup Language (RML) Utilities for SQL Server
答案 1 :(得分:2)
对于进行字符串搜索/操作的人来说,我的膝盖反射很快就会使用正则表达式进行搜索/替换。
困难的部分会决定你替换什么?一个名为@Adam
的参数看起来很奇怪,我不知道你怎么知道你想用@Name
替换它。
您能描述一下您的最终目标是什么吗?可能有更好的方法来做到这一点......