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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
+关注继续查看

原帖地址: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 ,如需转载请自行联系原作者

相关实践学习
使用交互方式创建数据表
本次实验主要介绍如何在RDS-SQLServer数据库中使用交互方式创建数据表。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
2天前
|
SQL 分布式计算 DataWorks
如果你在DataWorks中使用ODPS SQL时遇到"该文件对应引擎实例已失效,请重新选择可用的引擎实例"的错误提示
如果你在DataWorks中使用ODPS SQL时遇到"该文件对应引擎实例已失效,请重新选择可用的引擎实例"的错误提示
9 1
|
19天前
|
SQL 数据可视化 关系型数据库
快速导入mysql较大的SQL文件
快速导入mysql较大的SQL文件
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL异常解决】MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案
【MySQL异常解决】MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案
66 0
|
2月前
|
SQL XML Java
【SQL用法】Mybatis框架中的xml文件中经常使用的sql语句
【SQL用法】Mybatis框架中的xml文件中经常使用的sql语句
32 0
|
3月前
|
SQL 数据挖掘 数据库
数据库数据恢复-SQL SERVER数据库文件误还原备份的数据恢复方案
SQL SERVER数据库故障类型: 1、SQL SERVER数据库文件被删除。 2、SQL SERVER数据库所在分区格式化。 3、SQL SERVER数据库文件大小变为“0”。 4、使用备份还原数据库时覆盖原数据库。
|
3月前
|
SQL JSON 数据库
[UE虚幻引擎插件说明] DTSQLite 插件说明 :蓝图操作SQLite3文件,执行SQL语句。
本插件可以在UE里面使用蓝图操作SQLite3文件,并且执行SQL语句,CREATE,SELECT,DELETE,INSERT,UPDATE。 直接操作数据库,并返回相应结果集,并可以把结果集转换为TArray<TMap<FString,FString>>或是Json数据。
40 2
|
4月前
|
SQL Oracle Java
springboot启动时执行sql文件
springboot启动时执行sql文件
|
4月前
|
SQL 关系型数据库 MySQL
Navicat如何运行SQL脚本文件
一朋友初入门,今天导入sql文件时出错,我就简单记录了一下
857 1
|
5月前
|
SQL XML Java
Java语言执行SQL脚本文件
在程序执行过程中,难免会遇到一些建表等数据库操作 如果只有一个操作,可以执行在XML里编写。但是有多个时,就需要像Navicat这种开发工具直接执行SQL文件,在Java里同样也可以。
135 0
|
5月前
|
SQL 数据可视化 关系型数据库
漏刻有时数据可视化大屏常见问题(9):mysql数据库.sql文件制作自动安装格式的解决方案
漏刻有时数据可视化大屏常见问题(9):mysql数据库.sql文件制作自动安装格式的解决方案
34 0
推荐文章
更多