以前处理单引号都是对每个参数进行逐个替换 replace("'","''"),感觉比较麻烦现在想在SQL语句组合完后,利用正则直接替换组合完毕的SQL语句,岂不是很方便也搜索了这方面的资料,找到了一个C#下的正则,没环境,不知道能不能用,现在想要个普通的正则,不知道能不能实现思索许久,无果直接上个复杂的吧比如把下面的SQL语句:
select * from [test] where [text1] like '% a ' , % ' . b ' c %' and [text2]=' a ' , % ' . b ' c 'insert into [test]([text1],[text2]) values (' a ' , % ' . b ' c ',' a ' , % ' . b ' c ')
替换成:
select * from [test] where [text1] like '% a '' , % '' . b '' c %' and [text2]=' a ' , % ' . b ' c 'insert into [test]([text1],[text2]) values (' a '' , % '' . b '' c ',' a '' , % '' . b '' c ')
红色标注的单引号是SQL的标识符,其它单引号统统替换成双引号,貌似有点复杂了。还请高人指点

解决方案 »

  1.   

    参考:转一个正则表达式函数!
    create function dbo.regexReplace
    (
    @source varchar(5000), --原字符串
    @regexp varchar(1000), --正则表达式
    @replace varchar(1000), --替换值
    @globalReplace bit = 0, --是否是全局替换
    @ignoreCase bit = 0 --是否忽略大小写
    )
    returnS varchar(1000) AS
    begin
    declare @hr integer
    declare @objRegExp integer
    declare @result varchar(5000)exec @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
    IF @hr <> 0 begin
    exec @hr = sp_OADestroy @objRegExp
    return null
    end
    exec @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
    IF @hr <> 0 begin
    exec @hr = sp_OADestroy @objRegExp
    return null
    end
    exec @hr = sp_OASetProperty @objRegExp, 'Global', @globalReplace
    IF @hr <> 0 begin
    exec @hr = sp_OADestroy @objRegExp
    return null
    end
    exec @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase
    IF @hr <> 0 begin
    exec @hr = sp_OADestroy @objRegExp
    return null
    end 
    exec @hr = sp_OAMethod @objRegExp, 'Replace', @result OUTPUT, @source, @replace
    IF @hr <> 0 begin
    exec @hr = sp_OADestroy @objRegExp
    return null
    end
    exec @hr = sp_OADestroy @objRegExp
    IF @hr <> 0 begin
    return null
    endreturn @result
    end
    GO--调用
    create table t
    (col varchar(50))insert t
    select '12ABCDEFG34' union all
    select 'A1B2C3' union all
    select 'DDKFDK34KD23'
    select cast(dbo.regexReplace(col,'[^0-9]','',1,1) as varchar(30)) as col from tdrop table t
    drop function dbo.regexReplacecol                            
    ------------------------------ 
    1234
    123
    3423(所影响的行数为 3 行)
      

  2.   

    sql server 中没有内建的regexp 函数,你需要自己定义一个,你可以在C#中写好CLR的函数,然后加载到sql server 中。
      

  3.   


    我只需要正则表达式,不一定要SQL Server去处理
      

  4.   

    sql又沒有內建regexp
    如何正則???
      

  5.   

    楼主就要一个按SQL的语法要求,替换'的正则,并不需要SQL来处理。
      

  6.   


    搞不明白SQL Server自己是怎么识别SQL语句的,哎,真的没办法吗???
      

  7.   

    应该要写个语法解析,并不能简单地根据 and,or,=, 来判断是替换成双还是保留一个,去WEB开发那里问一下吧,相对那里比较多正则高手。