从word中复制数据到编辑器。经常因word格式超过8000字符。只能存储到text。请问编辑器中的数据怎么保存到sqlserver2000的text。sqlserver2005的varchar(max)能够直接用insert into进行插入吗?用select 进行显示吗?

解决方案 »

  1.   

    能够直接用insert into进行插入.不过显示有点问题,因为text一般是二进制的内容,所以即使显示出来也没有意义.
      

  2.   

    参考帮助的内容:
    管理 ntext、text 和 image 数据
    Microsoft® SQL Server™ 的 ntext、text 和 image 数据类型在单个值中可以包含非常大的数据量(最大可达 2 GB)。单个数据值通常比应用程序在一个步骤中能够检索的大;某些值可能还会大于客户端的可用虚拟内存。因此,在检索这些值时,通常需要一些特殊的步骤。如果 ntext、text 和 image 数据值不超过 Unicode 串、字符串或二进制串的长度(分别为 4,000 个字符、8,000 个字符和 8,000 个字节),就可以在 SELECT、UPDATE 和 INSERT 语句中引用它们,其引用方式与较小的数据类型相同。例如,包含短值的 ntext 列可以在 SELECT 语句的选择列表中引用,这与 nvarchar 列的引用方式相同。引用时必须遵守一些限制,例如不能在 WHERE 子句中直接引用 ntext、text 或 image 列。这些列可以作为返回其它数据类型(例如 ISNULL、SUBSTRING 或 PATINDEX)的某个函数的参数包含在 WHERE 子句中,也可以包含在 IS NULL、IS NOT NULL 或 LIKE 表达式中。处理较大的数据值
    但是,如果 ntext、text 和 image 数据值较大,则必须逐块处理。Transact-SQL 和数据库 API 均包含使应用程序可以逐块处理 ntext、text 和 image 数据的函数。数据库 API 按照一种通用的模式处理长 ntext、text 和 image 列: 若要读取一个长列,应用程序只需在选择列表中包含 ntext、text 或 image 列,并将该列绑定到一个程序变量,该变量应足以容纳适当的数据块。然后,应用程序就可以执行该语句,并使用 API 函数或方法将数据逐块检索到绑定的变量中。
    若要写入一个长列,应用程序可使用参数标记 (?) 在相应位置代替 ntext、text 或 image 列中的值,以执行 INSERT 或 UPDATE 语句。参数标记(对 ADO 而言则为参数)被绑定到一个足以容纳数据块的程序变量上。应用程序进入循环,在循环中先将下一组数据移到绑定的变量中,然后调用 API 函数或方法写入数据块。这一过程将反复进行,直到整个数据值发送完毕。 
    使用 text in row
    在 Microsoft SQL Server 2000 中,用户可以在表上启用 text in row 选项,以使该表能够在其数据行中存储 text、ntext 或 image 数据。若要启用该选项,请执行 sp_tableoption 存储过程,将 text in row 指定为选项名并将 on 指定为选项值。BLOB(二进制大对象:text、ntext 或 image 数据)行中可以存储的默认最大大小为 256 字节,但是值的范围可以从 24 到 7000。若要指定默认值以外的最大大小,请指定该范围内的整数作为选项值。如果应用下列条件,则将 text、ntext 或 image 字符串存储在数据行中: 启用 text in row。
    字符串的长度比 @OptionValue 所指定的限制短
    数据行中有足够的可用空间。 
    当 BLOB 字符串存储在数据行中时,读取和写入 text、ntext 或 image 字符串可以与读取或写入字符串和二进制字符串一样快。SQL Server 不必访问单独的页以读取或写入 BLOB 字符串。 如果 text、ntext 或 image 字符串比行中所指定的限制或可用空间大,则将指针存储在该行中。在行中存储 BLOB 字符串的条件仍然适用,但是:数据行中必须有足够的空间容纳指针。 有关更多信息,请参见 sp_tableoption。使用文本指针
    如果未指定 text in row 选项,text、ntext 或 image 字符串将存储在数据行外;只有这些字符串的文本指针驻留在数据行中。文本指针指向由内部指针生成的树的根节点,而这些内部指针映射到实际存储(text、ntext 或 image 数据的)字符串段的页。 SQL Server 2000 中的行文本指针与 SQL Server 早期版本中的文本指针不同。行文本指针的行为就象 BLOB 数据的文件句柄;早期的文本指针功能则象 BLOB 数据的地址。因此,在使用行文本指针时,请记住下列特性:重要  虽然游标中允许有行文本,但却不允许有行文本指针。如果尝试声明包含行文本指针的游标,SQL Server 将返回错误信息(8654、16、1、"A cursor plan could not be generated for the given statement because it contains textptr(inrow lob)."、1033)。数字 
    对于每个数据库,每个事务最多允许 1024 个活动行文本指针。锁定 
    当用户获取活动文本指针时,SQL Server 2000 在第一个用户控制文本指针时锁定数据行,并确保没有其他用户修改或删除该行。锁在文本指针变为无效时被释放。若要使文本指针无效,请使用 sp_invalidate_textptr。当事务的隔离级别是未提交读或者数据库为"只读"模式时,文本指针不能用于更新 BLOB 值。当数据库为"单用户"模式时,SQL Server 2000 不锁定数据行。为举例说明,给出下面的表:CREATE TABLE t1 (c1 int, c2 text)
    EXEC sp_tableoption 't1', 'text in row', 'on'
    INSERT t1 VALUES ('1', 'a')下面的事务将会成功:INSERT t1 VALUES ('1','This is text.')
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    GO
    BEGIN TRAN
    DECLARE @ptr varbinary(16)
    SELECT @ptr = textptr(c2)
    FROM t1
    WHERE c1 = 1
    READTEXT t1.c2 @ptr 0 5
    COMMIT TRAN
    GO下面的事务将会失败:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    GO
    BEGIN TRAN
    DECLARE @ptr varbinary(16)
    SELECT @ptr = textptr(c2)
    FROM t1
    WHERE c1 = 1
    WRITETEXT t1.c2 @ptr 'xx'
    COMMIT TRAN
    GO持续时间 
    行文本指针仅在事务内有效。提交事务时,文本指针变为无效。在某个事务内,当发生下列任一操作时,行文本指针可能无效:会话结束。
    删除该事务中的数据行。(其它事务无法删除数据行,因为该行包含锁。)
    文本指针所在的表的架构已更改。使文本指针无效的架构更改操作包括:创建或除去聚集索引,改变或除去表,截断表,通过 sp_tableoption 更改 text in row 选项,以及执行 sp_indexoption。 
    使用前面的示例,下列脚本在 SQL Server 早期版本中有效,但在 SQL Server 2000 中将生成错误。DECLARE @ptrval varbinary(16)
    PRINT 'get error here'
    SELECT @ptrval = TEXTPTR(c2)
    FROM t1
    WHERE c1 = 1
    READTEXT t1.c2 @ptrval 0 1在 SQL Server 2000 中,必须在事务内使用行文本指针:BEGIN TRAN
    DECLARE @ptrval varbinary(16)
    SELECT @ptrval = TEXTPTR(c2)
    FROM t1
    WHERE c1 = 1
    READTEXT t1.c2 @ptrval 0 1
    COMMITNULL 文本 
    可以在由 INSERT 生成的 NULL 文本上获得行文本指针。而在以前,只有将 BLOB 更新为 NULL 后才能获得文本指针。例如,下列代码在 SQL Server 7.0 中无效,但在 SQL Server 2000 中有效。SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    GO
    INSERT INTO t1 VALUES (4, NULL)
    BEGIN TRAN
    DECLARE @ptrval VARBINARY(16)
    SELECT @ptrval = TEXTPTR(c2)
    FROM t1
    WHERE c1 = 4
    WRITETEXT t1.c2 @ptrval 'x4'
    COMMIT在 SQL Server 7.0 中,必须执行下列操作:INSERT INTO t1 VALUES (4, NULL)
    UPDATE t1 
        SET c2 = NULL 
        WHERE c1 = 4
    DECLARE @ptrval VARBINARY(16)
    SELECT @ptrval = TEXTPTR(c2)
    FROM t1
    WHERE c1 = 4
    WRITETEXT t1.c2 @ptrval 'x4'下表汇总差别。差别 行文本指针 非行文本指针 
    数字 对于每个数据库,每个事务最多允许 1024 个活动行文本指针。 无限制。 
    锁定 将数据行一直 S 锁定到指针变为无效为止。 
    当事务为"未提交读"或数据库为"单用户"或"只读"模式时不获取锁。
     不锁定数据行。 
    持续时间 事务或会话结束、删除行或更改表的架构时变为无效。 删除行时变为无效。 
    NULL 文本 插入 NULL 文本后可立即获取。 只有更新后才能获取。 
    通过数据库 API 使用 ntext、text 和 image 数据
    这一部分概述数据库 API 处理 ntext、text 和 image 数据的方式: ADO 
    ADO 可以将 ntext、text 或 image 列或参数映射为 Field 或 Parameter 对象。使用 GetChunk 方法逐块检索数据,使用 AppendChunk 方法逐块写数据。有关更多信息,请参见管理 Long 数据类型。 OLE DB 
    OLE DB 使用 ISequentialStream 接口支持 ntext、text 和 image 数据类型。ISequentialStream::Read 方法逐块读取长数据,ISequentialStream::Write 方法将长数据逐块写入数据库。有关更多信息,请参见 BLOB 和 OLE 对象。ODBC 
    ODBC 具有一种称为"执行中的数据"的功能,可用于处理长数据的 ODBC 数据类型:SQL_WLONGVARCHAR (ntext)、SQL_LONGVARCHAR (text) 和 SQL_LONGVARBINARY (image)。这些数据类型被绑定到某个程序变量上。这样一来,就可以调用 SQLGetData 逐块检索长数据,调用 SQLPutData 逐块发送长数据。有关更多信息,请参见管理 text 和 image 列。 DB-Library 
    DB-Library 应用程序也是将 ntext、text 和 image 列绑定到程序变量上。DB-Library 函数 dbtxtptr 用于获取指向数据库中长列出现位置的指针,dbreadtext 则用来逐块读取长数据。dbwritetext、dbupdatetext 和 dbmoretext 之类的函数用于逐块写入长数据。 
      

  3.   

    --更新参考:--更新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 testgo
    --删除数据测试环境
    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=@stateopen #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 testgo
    --删除数据测试环境
    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值为空会出错,需注意
      

  4.   

    sqlserver2000使用存储过程也可以吧
      

  5.   

    sqlserver2005的varchar(max)能够直接用insert into进行插入吗?用select 进行显示吗?
      

  6.   

    text 变长非Unicode的字符型数据,最大长度为2^31-1(2G) 更多资料参考:SQL数据库字段类型说明
      

  7.   

    而且text微软声称在将来的版本中可能废除,如果尽量不要用。
      

  8.   


    那我把数据库转成sqlserver 2005。应该就更好吧。
      

  9.   

    select varchar(max)字段。能将数据全部显示吗。还是得转换成数据流。?
      

  10.   


    如果存入的是文本数据(也就是字符型数据),可直接全部显示,如果存入的是整个文件,如.jpg,.rar,.doc文件等,用varbinary(max)数据类型,查询时需要转换。