使用C#中的参数动态替换SQL字符串

时间:2011-02-11 23:55:42

标签: c# .net sql sql-server

有没有人试图动态地将标准sql字符串转换为参数化查询?换句话说,我需要改变这个:

SELECT * FROM customers WHERE name = 'Adams'

到此:

SELECT * FROM customers WHERE name = @name

我已经开始使用Microsoft.Data.Schema.ScriptDom.Sql和Microsoft.Data.Schema.ScriptDom程序集,但在我坚持下去之前,我想知道是否已经有了一些东西在野外这会做到这一点。

2 个答案:

答案 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替换它。

您能描述一下您的最终目标是什么吗?可能有更好的方法来做到这一点......