表中有一些类似操作日志的记录,如select * from customers where customerid='TCANG'delete from orders where employeeid=9insert into customers values('AYWOT','Pdodgtrwa Ikuqyyayj,Onomkn Jagerg','Lgnuuf Bjxjxg','Pipzfb Yczzkh 692','Iiyhgt','NI','00328','Lbwywwd','57-8689-33306113')update orders set freight=009.91 where orderid=17050我想把它们中所有的具体值都替换成我所指定的一个字符串,如SOMEVALUE:select * from customers where customerid=SOMEVALUEdelete from orders where employeeid=SOMEVALUEinsert into customers values(SOMEVALUE)update orders set freight=SOMEVALUE where orderid=SOMEVALUE我打算用游标对每条这种记录做某个操作,达到这个目的。有什么好的方案吗?由于要替换的内容长度、位置都不确定,所以似乎有些复杂。

解决方案 »

  1.   

    declare @SOMEVALUE as varchar(10)
    set @SOMEVALUE = 'XXXXXXXXX'select * from customers where customerid=@SOMEVALUEdelete from orders where employeeid=@SOMEVALUEinsert into customers values(@SOMEVALUE)update orders set freight=@SOMEVALUE where orderid=@SOMEVALUE
      

  2.   

    比如给你一个字符串A:select * from customers where customerid='TCANG'如何把它变成字符串B:select * from customers where customerid=SOMEVALUE前提是A不一定是个select语句还是delete、insert、update语句,而待替换的内容也相应地是不确定的
      

  3.   

    唯一可用的信息是:待替换的内容肯定是:1、紧跟着等号后面的,它的后面不是空格就是整个字符串的结尾(select、delete、update的情况)2、在紧跟values后面的括号中(insert的情况)
    其实还有一种情况,就是执行存储过程的语句。如:exec add 1,2 (结果为3)同样地,我想忽略掉它的两个参数1和2,变成exec add SOMEVALUE,SOMEVALUE怎么办?难不成要在SQL下写个词法分析器?OMG
      

  4.   

    刚刚又发现一个问题:比如select * from customers where customerid='TCANG'和select * from customers where customerid = 'TCANG' (比上一个等号两遍多了两个空格)这两个语句是等效的,都能成功执行。这就意味着它们都有存在的可能。我刚才本想豁出去,先根据空格把字符串拆解,再一个个判断。但是这个特性似乎又带来了麻烦
      

  5.   

    /*
    我只写了替换等于的情况,其它情况楼主参照写:
    */declare @Test table (ha varchar(8000))
    insert @Test select 'select * from customers where customerid=''TCANG'''
    insert @Test select 'delete from orders where employeeid   = 9'
    insert @Test select 'update orders set freight= 009.91 where orderid =17050'while exists (select 1 from @Test where charindex(' =', ha) > 0) update @Test set ha = replace(ha, ' =', '=') where charindex(' =', ha) > 0
    while exists (select 1 from @Test where charindex('= ', ha) > 0) update @Test set ha = replace(ha, '= ', '=') where charindex('= ', ha) > 0
    update @Test set ha = replace(ha, '=', ' = ') where charindex('=', ha) > 0
    update @Test set ha = ha + ' ' --这个空格很重要declare @Replace varchar(100)
    set @Replace = 'SOMEVALUE'select * from @Test
    /*
    select * from customers where customerid = 'TCANG' 
    delete from orders where employeeid = 9 
    update orders set freight = 009.91 where orderid = 17050 
    */while exists (select 1 from @Test where charindex(' = ', ha) > 0) update @Test set ha = stuff(ha, charindex(' = ', ha),charindex(' ', ha, charindex(' = ', ha) + 3) - charindex(' = ', ha), '=' + @Replace) where charindex(' = ', ha) > 0
    select * from @Test
    /*
    select * from customers where customerid=SOMEVALUE 
    delete from orders where employeeid=SOMEVALUE 
    update orders set freight=SOMEVALUE where orderid=SOMEVALUE 
    */
      

  6.   

    haha, yes! yes!八卦一下:你怎么要这样替换?
      

  7.   

    我是想从众多的“日志”中统计出用户常用的SQL语句,所以要忽略掉具体的数据
      

  8.   

    我是想在SQL里面把数据整理了就得了,没有太多时间再做个程序了
      

  9.   

    嗯,等号的没问题了insert into 的后面的values,我打算直接从values开始知道最后直接替换剩下的就是执行带参数的存储过程了