开发者社区> 技术小甜> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【51CTO/BBS】如何完全用SQL语句,将文件存(取)到数据库?

简介:
+关注继续查看

原帖地址:http://bbs.51cto.com/thread-1130840-1.html

 

问题描述:

 

我准备在MS-SQL服务器端建立一个存储过程,需要用纯SQL语句存取文件。   
求老师指导一下!!

 

解决方案:

 

有些方法用于导入和导出图片、照片、视频、文档等BLOB类型数据。

 

SQL Server 2000:

 

在binn目录下的未公开工具可用,提示你提供相应的参数:

textcopy

 

使用textcopy对sqlserver的Image字段进行读取和写入

用存储过程方法:


1、建立过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 
GO


2、建表和初始化数据

1
2
3
4
5
create table 表名 (编号 int,image列名 image)    
go    
insert 表名 values(1,0x)    -- 必须的,且不是null    
insert 表名 values(2,0x)    -- 必须的,且不是null    
go


3、读入

1
2
3
sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\图片.bmp','where 编号=1','I' --注意条件是 编号=1    
sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\bb.doc','where 编号=2','I' --注意条件是 编号=2    
go


4、读出成文件

1
2
3
sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\图片.bmp','where 编号=1','O' --注意条件是 编号=1    
sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\bb.doc','where 编号=2','O' --注意条件是 编号=2    
go

 

注意:


如果报textcopy不是可执行文件的话,你就到   
C:\Program Files\Microsoft SQL Server\MSSQL\Binn    
目录下拷备 textcopy.exe到:    
C:\Program Files\Microsoft SQL Server\80\Tools\Binn

 

开启xp_cmdshell方法:

1
2
3
4
5
--启用xp_cmdshell   
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;    
--关闭xp_cmdshell    
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;    
--如果提示拒绝访问,一般是目录权限的问题,可新建一个目录,加入Everyone完全控制权限即可。

 

SQL Server 2005:

 

通过OPENROWSET和bcp:

 

示例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
-- SQL Server import image - SQL Server export image
-- Extract image SQL Server - SQL Server export binary data
USE AdventureWorks;
GO
  
-- Create image warehouse for importing image into sql database
CREATE TABLE dbo.PhotoLibrary (
  PhotoLibraryID INT IDENTITY ( 1 , 1 ) PRIMARY KEY,
  ImageName        VARCHAR(100),
  Photo            VARBINARY(MAX))
GO
  
-- SQL Server import image - sql storing images database sql server
INSERT INTO dbo.PhotoLibrary
([ImageName])
VALUES     ('MadisonAVE.JPG')
UPDATE dbo.PhotoLibrary
SET    Photo = (SELECT *
FROM OPENROWSET(BULK 'e:\image\photo\MadisonAVE.JPG',
SINGLE_BLOB) AS x)
WHERE  [ImageName] = 'MadisonAVE.JPG'
GO
  
-- Check table population
SELECT *
FROM   dbo.PhotoLibrary
GO
  
-- SQL Server export image
DECLARE  @Command NVARCHAR(4000)
  
-- Keep the command on ONE LINE - SINGLE LINE!!! - broken here for presentation
SET @Command = 'bcp "SELECT Photo FROM AdventureWorks.dbo.PhotoLibrary"
                   queryout "e:\image\photo\expMadisonAVE.jpg" -T -n -SPROD\SQL2005'
PRINT @Command -- debugging
EXEC xp_cmdshell @Command
GO

 

 示例2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
------------
-- T-SQL Export all images in table to file system folder
-- Source table: Production.ProductPhoto  - Destination: K:\data\images\productphoto\
------------
  
USE AdventureWorks2008;
GO
  
DECLARE  @Command       VARCHAR(4000),
         @PhotoID       INT,
         @ImageFileName VARCHAR(128)
DECLARE curPhotoImage CURSOR FOR -- Cursor for each image in table
SELECT ProductPhotoID,
       LargePhotoFileName
FROM   Production.ProductPhoto
WHERE  LargePhotoFileName != 'no_image_available_large.gif'
OPEN curPhotoImage
FETCH NEXT FROM curPhotoImage
INTO @PhotoID,
     @ImageFileName
WHILE (@@FETCH_STATUS = 0) -- Cursor loop 
BEGIN
  
-- Keep the bcp command on ONE LINE - SINGLE LINE!!! - broken up for presentation
SET @Command = 'bcp "SELECT LargePhoto FROM
    AdventureWorks2008.Production.ProductPhoto WHERE ProductPhotoID = ' +
convert(VARCHAR,@PhotoID) + '" queryout "K:\data\images\productphoto\' +
    @ImageFileName + '" -T -n -SHPESTAR'
PRINT @Command – debugging 
  
/* bcp "SELECT LargePhoto FROM AdventureWorks2008.Production.ProductPhoto
WHERE ProductPhotoID = 69" queryout
"K:\data\images\productphoto\racer02_black_f_large.gif" -T -n -SHPESTAR
*/
  
EXEC xp_cmdshell @Command     -- Carry out image export to file from db table
FETCH NEXT FROM curPhotoImage
INTO @PhotoID,
         @ImageFileName
END -- cursor loop
CLOSE curPhotoImage
DEALLOCATE curPhotoImage
  
/*output
NULL
Starting copy...
NULL
rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 16     Average : (62.50 rows per sec.)
NULL
.....
*/
  
------------



















本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1585003 ,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SQL数据库学习之路(九)
目录   数据库创建补充: 为数据库用户赋予权限 在数据库表中使用视图进行添加修改 数据库创建补充: 以文本格式显示自己创建的数据库表                                          以网格格式显示自己创建的数据库表 可以右键数据库--属性---选项,在选项中可以设置数据库的兼容性,还有是否可以让多人同时访问或者单人访问。
888 0
SQL数据库学习之路(练习)---C#登录界面连数据库
目录 C#登录界面连数据库 一、在数据库中先创建一个数据库。 二、在VS中创建C#的windows窗体应用程序 三、在VS中连接到数据库 四、设计登录界面 五、设置注册界面 六、将form1的按钮和form2进行关联 七、设置form2界面的注册按钮 八、form1的登录按钮设置 九、运行成果 参考文章: C#登录界面连数据库 一、在数据库中先创建一个数据库。
2787 0
SQL数据库学习之路(八)
数据库介绍: 在网页上的主程序中进行注册操作,然后把数据发送给人,人传递这些数据到数据库当中。   为什么学ADO.NET:之前我们所学的只能在查询分析器中查看数据,操作数据。
896 0
SQL数据库学习之路(七)
在SQL server managerment中可以点击帮助,会有帮助文档。 一、联合查询 将多个查询结果集合并成一个。
835 0
SQL数据库学习之路(六)
一、连接查询:当需要的结果需要从多张表中取时 关键问题:哪些表、关系(学生表的Id联系到班级表的Id) 内连接:inner join,两表中完全匹配的数据。
922 0
SQL数据库学习之路(四)
要求:通过SQL语句创建以下基本表:    教师关系 T(T#, TNAME,TITLE)    课程关系 C(C#,CNAME,T#)    学生关系 S(S#,SNAME,AGE,SEX)    选课关系SC(S#,C#,SCORE)    班级关系CLASS(CLASSID,CLASSNAME)    其中红色粗体为主键,带下划线的属性为外键。
826 0
SQL数据库学习之路(三)
一.表数据的操作 1.简单查询 select * from 表名 2.增加数据 insert into 表名(列名) values(值)                   ----要求值的列名与值要位置对应   ...
802 0
SQL数据库学习之路(二)
(一)1.约束:实现数据的有效性检查---------主键(保证值是唯一的) 2.非空(输入的数据不允许为空) 3.唯一(存入的数据不能重复) 4.默认(自己不给数据添加值,值会默认添加) 5.检查(给值一个选定的范围) 6.外键(对关系的有效性进行检查,有关系才有外键) (二)脚本操作数据库 1.不区分大小写,字符串使用单引号,末尾不需要加分号。
815 0
SQL数据库学习之路(一)
1.数据库简介(一个放数据的仓库)  解决的问题:持久化存储,优化读写,保证数据的有效性 关系型数据库:    基于E-R模型(实体-联系图Entity Relationship)    使用sq|语言进行操作(SQL...
1033 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
SQL Sever迁移PG经验
立即下载
微信SQLite数据库损坏恢复实践
立即下载
PostgresChina2018_刘东明_PostgreSQL并行查询
立即下载