2011-02-11 25 views
2

有没有人试图动态地将标准的SQL字符串转换为参数化查询?换句话说,我需要改变这样的:动态地用C#中的参数替换SQL字符串

SELECT * FROM customers WHERE name = 'Adams' 

这样:

SELECT * FROM customers WHERE name = @name 

我已经开始与Microsoft.Data.Schema.ScriptDom.Sql和Microsoft.Data.Schema工作.ScriptDom的程序集,但在我忍受它之前,我想知道是否有一些东西已经出现在这种情况下。

+1

我从来没有见过它。你究竟想要做什么就需要这个? – 2011-02-11 23:59:24

回答

5

SQL Server做到这一点下(和工具像ClearTrace)。

一种方法是使用正则表达式进行规范化(你正在寻找不正是为),如基于由伊茨克奔甘做和修改由亚当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

2

那么我的膝盖混蛋反应有人做字符串搜索/操纵将使用正则表达式来搜索/替换。

困难的部分变成确定你替换什么?一个名为@Adam的参数看起来很奇怪,我不知道你怎么知道你想用@Name替换它。

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

+0

我实际上需要解析字符串并对其进行参数化,但我还需要将列映射回一个元数据层,该层应用适当的验证和列名等。 – AlexGad 2011-02-12 01:08:01

+0

我能够使Microsoft.Data.Schema.ScriptDom工作。一旦我清理完了,我会将代码发回给未来的参考。 – AlexGad 2011-02-12 01:10:01