您的位置:首页 > 数据库

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

2010-07-01 11:08 591 查看
问题:
今天遇到一个问题:就是如何应用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
]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐