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

Ale*_*Gad 2 .net c# sql sql-server

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

SELECT * FROM customers WHERE name = 'Adams'
Run Code Online (Sandbox Code Playgroud)

对此:

SELECT * FROM customers WHERE name = @name
Run Code Online (Sandbox Code Playgroud)

我已经开始使用Microsoft.Data.Schema.ScriptDom.Sql和Microsoft.Data.Schema.ScriptDom程序集了,但是在我坚持下去之前,我想知道是否有一些东西已经出现了这个.

Mit*_*eat 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");
}
Run Code Online (Sandbox Code Playgroud)

但输出的准确性可能无法捕获每个可能的参数短语.

我很好奇为什么你需要这个?

更新:正如Martin所说,还有用于SQL ServerRML实用程序

SQL Server的重播标记语言(RML)实用程序的说明