T_SQL存储过程读写图片,文件等(BLOB)字段

来源:互联网 发布:网络的坏处例子 编辑:程序博客网 时间:2024/05/24 03:44

问题:
      今天遇到一个问题:就是如何应用T_SQL语句把这样的字段写入到数据库表中,在csdn中搜索到了方法,同时又思考了原因,这里就写下来,省的下次忘掉。

    SQL联机丛书中说的语法格式是:

 

'command_string'

是在操作系统命令行解释器上执行的命令字符串。command_string 的数据类型为 varchar(255)nvarchar(4000),没有默认值。command_string 不能包含一对以上的双引号。如果由 command_string 引用的文件路径或程序名称中有空格,则需要使用一对引号。如果使用嵌入空格不方便,可考虑使用 FAT 8.3 文件名作为解决办法。

 

至于textcopy,查询联机丛书好像有这个存储过程:所以不知道它得格式建立是不是必须像上面写的那样,不过我试了试把login和password去掉的时候就报错了,所以可能是固定的格式:它的各个参数的含义如下:

   @srvname 服务器的名字,本机的话写成'.'就可以了

   @login      登陆用户名 'sa'
   @password       密码     
   @dbname         数据库名     
   @tbname          表名     
   @colname         image字段的列名     
   @filename         图片的路径     
   @whereclause   'where   编号=1  '   
   @direction         是读入还是从数据库读出

 

 这里写下一个过程为:

   insert into pub_infor values('1234',0x,'this is a sample')

然后读入图片:

  sp_textcopy   @srvname   =   '.',    
                          @login   =   'sa',    
                          @password   =   'sa',    
                          @dbname   =   'pubs',    
                          @tbname   =   'pub_info',    
                          @colname   =   'logo',    
                          @filename   =   'c:/picture.bmp',     
                    @whereclause   =   "   WHERE   pub_id='1234'   ",    
                          @direction   =   'I'

 读出为:

   sp_textcopy   @srvname   =   '.',    
                          @login   =   'sa',    
                          @password   =   'sa',    
                          @dbname   =   'pubs',    
                          @tbname   =   'pub_info',    
                          @colname   =   'logo',    
                          @filename   =   'D:/picture.bmp',     
                    @whereclause   =   "   WHERE   pub_id='1234'   ",    
                          @direction   =   'O'

 

清空:update   表   set   列=null

 

最后注意事项:因为filename的字符长度只有30个:即:

   @filename         varchar   (30),   

所以实际应用的时候最好改为255个,当含有比较长的路径的时候就会报错:

  ERROR: Augment 'xxx' unrecognize

还有参数的长度@exec_str   varchar   (255)也修改下比较好:

我改成了这样子:

 

   CREATE   PROCEDURE   sp_textcopy   (    
      @srvname         varchar   (30),    
      @login             varchar   (30),    
      @password         varchar   (30),    
      @dbname             varchar   (30),    
      @tbname             varchar   (30),    
      @colname         varchar   (30),    
      @filename         varchar   (255),    
      @whereclause   varchar   (40),    
      @direction     char(1))    
  AS    
  DECLARE   @exec_str   varchar   (400)    
  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

就只这样子了,感觉上T_SQL编程还是挺强大的,有时间应该好好学习下。

 

 


回答:

      这里以SQL_server2000中的pubs数据库中的pub_info表为例来说说其中的过程:pub_info表包含:pub_id,logo,pr_info,其中logo属于image超长字段,应用存储过程奖图像存储在数据库的步骤包括:

     1:首先:是插入一个列:

     比如:insert into pub_infor values('1234',0x,'this is a sample')其中0x只是为了确保image字段不能为空:因为下面的存储过程:textcopy

 用textcopy把图片或者文件拷贝到image类型字段之前,image类型的字段不能为空。先插入0x(或者0x0)到这个字段,然后就可以用textcopy了。

    否则就会报这样的错误:

   ERROR: Text or image pointer and timestamp retrieval failed.

    2:接下来建立存储过程:

    CREATE   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    
  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

说明:

  其中xp_cmdshell:

以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。授予非管理用户执行 xp_cmdshell 的权限。我自己的理解是:

textcopy就像是一个dos命令:就是说实际的文件copy命令是类似操作系统执行的。

    xp_cmdshell {'command_string'} [, no_output]

原创粉丝点击