2011-02-11 23 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