图片是直接保存在数据库的photo字段,是二进制数据
想直接UPDATETEXT一张新的图片到数据库中,下面这两条语句都可以直接将二进制的字符串写到数据库中
declare @t binary(16)
select @t=textptr(photo) from data where id=1'
updatetext CertificateContent.photo @t 0 null 0xFFD8FFE000104ADECLARE @val  binary(16)
DECLARE @selectstr varchar(MAX)
set @selectstr = 0xFFD8FFE000104A
SELECT @val = TEXTPTR(photo) FROM data where id='1'
UPDATETEXT CertificateContent.photo @val 0 null @selectstr现在的问题是,如果我把完整的字符串写到语句中,就是0xFFD8FFE000104A4649460001020100C800C80000FFE1136345786966000049492A00080000................
报错:开头的 标识符 太长。最大长度为 128

解决方案 »

  1.   


    --更新text字段的值 
    create table PE_Soft(SoftIntro text,ChannelID integer) 
    insert into PE_Soft 
    select 'aaa ',1004 union all 
    select 'bbb ',1003 union all 
    select 'ccc ',1002 declare @ptr binary(16) select @ptr=textptr(SoftIntro) from PE_Soft where ChannelID=1002 
    updatetext PE_Soft.SoftIntro @ptr null 0 'testing ' 
    select * from PE_Soft drop table PE_Soft 
    --text字段增加处理 --创建测试表 
    create table test(id varchar(3),detail text) 
    insert into test select '001','A*B' --定义添加的的字符串 
    declare @s_str varchar(8000),@postion int 
    select @s_str='*C' --要添加的字符串  
    ,@postion=null --追加的位置,null 加在尾部,0 加在首部,其他值则加在指定位置 
    --字符串添加处理 
    declare @p varbinary(16) 
    select @p=textptr(detail) from test where id='001' 
    updatetext test.detail @p @postion 0 @s_str --显示处理结果 
    select * from test 
    go 
    --删除测试表 
    drop table test 
    --text字段的替换处理 
    --创建数据测试环境 
    create table test(id varchar(3),txt text) 
    insert into test select '001','A*B' 
    go 
    --定义替换的字符串 
    declare @s_str varchar(8000),@d_str varchar(8000) 
    select @s_str='*' --要替换的字符串  
    ,@d_str='+' --替换成的字符串 
    --字符串替换处理 
    declare @p varbinary(16),@postion int,@rplen int 
    select @p=textptr(txt) ,@rplen=len(@s_str) ,@postion=charindex(@s_str,txt)-1 from test where id='001' 
    while @postion>0 
    begin  
    updatetext test.txt @p @postion @rplen @d_str  
    select @postion=charindex(@s_str,txt)-1 from test 
    end 
    --显示结果 
    select * from test go 
    --删除数据测试环境 
    drop table test 
    --text字段的添加处理存储过程
    --全表 
    --创建测试表 
    create table [user](uid int,UserLog text) 
    create table [order](uid int,state bit) 
    insert into [user] 
    select 1,'a' union all 
    select 2,'b' union all 
    select 3,'c' insert into [order] 
    select 1,1 union all 
    select 2,0 union all 
    select 3,1 go 
    --处理的存储过程 
    CREATE PROCEDURE spUpdateUserLog 
    @StrLog text, 
    @State int 
    AS 
    --定义游标,循环处理数据 
    declare @uid int 
    declare #tb cursor for select a.uid from [user] a join [order] b on a.uid=b.uid where state=@state 
    open #tb 
    fetch next from #tb into @uid 
    while @@fetch_status=0 
    begin  
    --字符串添加处理  
    declare @p varbinary(16) 
    select @p=textptr(UserLog) from [user] where uid=@uid  
    updatetext [user].UserLog @p null 0 @StrLog  
    fetch next from #tb into @uid 
    end 
    close #tb 
    deallocate #tb 
    go 
    --调用示例: 
    exec spUpdateUserLog '123',1 
    --显示处理结果 
    select * from [user] 
    go 
    --删除测试环境 
    drop table [user],[order] 
    drop proc spUpdateUserLog 
    /*--测试结果 
    uid UserLog 
    ----------- ---------- 
    1 a123 2 b 3 c123 
    (所影响的行数为 3 行) 
    --*/ 
    --text字段的替换处理
    --全表替换 
    --创建数据测试环境 
    create table test(id varchar(3),txt text) 
    insert into test 
    select '001','A*B' union all 
    select '002','A*B-AA*BB' 
    go 
    --定义替换的字符串 
    declare @s_str varchar(8000),@d_str varchar(8000) 
    select @s_str='*' 
    --要替换的字符串  
    ,@d_str='+' 
    --替换成的字符串 
    --定义游标,循环处理数据 
    declare @id varchar(3) 
    declare #tb cursor for select id from test 
    open #tb 
    fetch next from #tb into @id 
    while @@fetch_status=0 
    begin  
    --字符串替换处理  
    declare @p varbinary(16),@postion int,@rplen int  
    select @p=textptr(txt) ,@rplen=len(@s_str) ,@postion=charindex(@s_str,txt)-1  from test where id=@id  
    while @postion>0  
    begin  
    updatetext test.txt @p @postion @rplen @d_str  
    select @postion=charindex(@s_str,txt)-1 from test where id=@id  
    end  
    fetch next from #tb into @id 
    end 
    close #tb 
    deallocate #tb 
    --显示结果 
    select * from test 
    go 
    --删除数据测试环境 
    drop table test 
    ************************ 支持text字段处理的仅有: 下面的函数和语句可以与 ntext、text 或 image 数据一起使用。
    函数 语句 
    DATALENGTH READTEXT 
    PATINDEX SET TEXTSIZE 
    SUBSTRING UPDATETEXT 
    TEXTPTR WRITETEXT 
    TEXTVALID 1:替换 
    --创建数据测试环境 
    create table #tb(aa text) 
    insert into #tb select 'abc123abc123,asd' --定义替换的字符串 declare @s_str varchar(8000),@d_str varchar(8000) select @s_str='123' --要替换的字符串 ,@d_str='000' --替换成的字符串 --字符串替换处理 declare @p varbinary(16),@postion int,@rplen int select @p=textptr(aa),@rplen=len(@s_str),@postion=charindex(@s_str,aa)-1 from #tb while @postion>0 begin updatetext #tb.aa @p @postion @rplen @d_str select @postion=charindex(@s_str,aa)-1 from #tb end --显示结果 select * from #tb --删除数据测试环境 drop table #tb /****************全部替换************************/ DECLARE @ptrval binary(16) SELECT @ptrval = TEXTPTR(aa) FROM #tb WHERE aa like '%数据2%' if @ptrval is not null -- 一定要加上此句,否则若找不到数据下一句就会报错 UPDATETEXT #tb.aa @ptrval 0 null '数据3' /****************在字段尾添加**********************************/ --定义添加的的字符串 declare @s_str varchar(8000) select @s_str='*C' --要添加的字符串 --字符串添加处理 declare @p varbinary(16),@postion int,@rplen int select @p=textptr(detail) from test where id='001' updatetext test.detail @p null null @s_str 总结: 1:Text字段类型不能直接用replace函数来替换,必须用updatetext 2:字段比较不能用 where 字段 = ‘某数据’,可以用like来代替 3:updatetext时,若@ptrval值为空会出错,需注意