在SQLServer中,有没有一个命令可以把一个文件的内容读出来,赋给一个字符串变量,或者通过什么途径能达到这个效果,

解决方案 »

  1.   

    create table aaa(a int,b text)
    goCREATE PROCEDURE sp_textcopy 
      @srvname    varchar (30), 
      @login      varchar (30), 
      @password    varchar (30), 
      @dbname      varchar (30), 
      @tbname      varchar (30), 
      @colname    varchar (30), 
      @filename    varchar (30), 
      @whereclause varchar (40), 
      @direction  char(1) 
    AS 
    /* 这是使用textcopy工具将文件插入到数据库中,如果有前台工具可以用前台开发工具将文件插入,这里为了演示 */
    DECLARE @exec_str varchar (255) 
    SELECT @exec_str='textcopy /S '+@srvname+' /U '+@login+' /P '+@password+' /D '+@dbname+' /T'+@tbname+' /C '+@colname+' /W"'+@whereclause+'" /F"'+@filename+'" /'+@direction
    EXEC master..xp_cmdshell @exec_str
    goinsert aaa values(1,'') --''是必须的不是null
    sp_textcopy 'daliserver','sa','element','test','aaa','b','c:\tt.txt','where a=1','I' --注意条件是 a=1
    go
    drop table aaa
    go
    drop proc sp_textcopy前提c:\下有tt.txt文件,如果报textcopy不是可执行文件的话,你就到
    C:\Program Files\Microsoft SQL Server\MSSQL\Binn
    目录下拷备 textcopy.exe到:
    C:\Program Files\Microsoft SQL Server\80\Tools\Binn
      

  2.   

    用Text类型:READTEXT
    UPDATETEXT
    WRITETEXT
    --------------------
     Transact-SQL 参考  
    READTEXT
    读取 text、ntext 或 image 列中的 text、ntext 或 image 值,从指定的偏移量开始读取指定的字节数。语法
    READTEXT { table.column text_ptr offset size } [ HOLDLOCK ] 参数
    table.column是从中读取的表和列的名称。表名和列名必须符合标识符的规则。必须指定表名和列名,不过可以选择是否指定数据库名称和所有者名称。text_ptr有效文本指针。text_ptr 必须是 binary(16)。offset开始读取 text、image 或 ntext 数据之前跳过的字节数(使用 text 或 image 数据类型时)或字符数(使用 ntext 数据类型时)。使用 ntext 数据类型时,offset 是在开始读取数据前跳过的字符数。使用 text 或 image 数据类型时,offset 是在开始读取数据前跳过的字节数。 size是要读取数据的字节数(使用 text 或 image 数据类型时)或字符数(使用 ntext 数据类型时)。如果 size 是 0,则表示读取了 4 KB 字节的数据。HOLDLOCK使文本值一直锁定到事务结束。其他用户可以读取该值,但是不能对其进行修改。注释
    使用 TEXTPTR 函数获得有效的 text_ptr 值。如果返回不止一行,TEXTPTR 将返回指向指定行中的 text、ntext 或 image 列的指针,或返回指向查询所返回的最后一行中的 text、ntext 或 image 列的指针。由于 TEXTPTR 返回 16 字节的二进制字符串,所以最好声明一个控制文本指针的局部变量,然后在 READTEXT 中使用该变量。有关声明局部变量的更多信息,请参见 DECLARE @local_variable。 在 SQL Server 2000 中可能存在无效的文本指针。有关 text in row 选项的更多信息,请参见 sp_tableoption。有关如何使文本指针无效的更多信息,请参见 sp_invalidate_textptr。如果 @@TEXTSIZE 函数的值小于为 READTEXT 指定的大小,它将替代为 READTEXT 指定的大小。@@TEXTSIZE 函数是对由 SET TEXTSIZE 语句设置的返回数据字节数的限制。有关如何设置 TEXTSIZE 会话设置的更多信息,请参见 SET TEXTSIZE。权限
    READTEXT 权限默认授予对指定的表具有 SELECT 权限的用户。这些权限可在传递 SELECT 权限时传递。示例
    下例读取 pub_info 表中 pr_info 列的第 2 个至第 26 个字符。USE pubs
    GO
    DECLARE @ptrval varbinary(16)
    SELECT @ptrval = TEXTPTR(pr_info) 
       FROM pub_info pr INNER JOIN publishers p
          ON pr.pub_id = p.pub_id 
          AND p.pub_name = 'New Moon Books'
    READTEXT pub_info.pr_info @ptrval 1 25
    GO
    请参见@@TEXTSIZEUPDATETEXTWRITETEXT©1988-2000 Microsoft Corporation。保留所有权利。
      

  3.   

    注意 updatetxt有个问题 只能对最后一行更新比如
    create table a ( id int, a text)insert a select 1,'erere'
    insert a select 2,'93e'
    要在字符的尾部加上 d 变成 erered,93e
    DECLARE @ptrval varbinary(16)
    SELECT @ptrval = TEXTPTR(a)  FROM aupdateTEXT a.a  @ptrval null null 'r'select * from a1 erere
    2 93er
      

  4.   

    注意 updatetxt有个问题 只能对最后一行更新比如
    create table a ( id int, a text)insert a select 1,'erere'
    insert a select 2,'93e'
    要在字符的尾部加上 d 变成 erered,93e
    DECLARE @ptrval varbinary(16)
    SELECT @ptrval = TEXTPTR(a)  FROM aupdateTEXT a.a  @ptrval null null 'r'select * from a1 erere
    2 93er
      

  5.   

    你是不是想把一个文本文件的内容赋给sql变量啊那这样,先把文件导入临时表过渡
    用BULK INSERT 库名.dbo.表名
       FROM 'f:\1.txt'
       WITH 
          (
             FIELDTERMINATOR = ' ',
             ROWTERMINATOR = '\n'
          )或者
    EXEC master..xp_cmdshell 'bcp test.dbo.P_Aspect in c:\temp1.txt -c -q -S"servername" -U"sa" -P""'
    //导入然后
    select @变量=字段名 from 表名 where ...