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

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

问题描述:

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

解决方案:

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

SQL Server 2000:

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

textcopy

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

用存储过程方法:

1、建立过程

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、建表和初始化数据

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

3、读入

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

4、读出成文件

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方法:

--启用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:

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

------------
-- 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
1 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 16     Average : (62.50 rows per sec.)
NULL
.....
*/
 
------------
时间: 2024-08-28 21:11:14

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

【51CTO/BBS】请教: SQL里有没有字符串组合Join的函数??

[51CTO/BBS]请教: SQL里有没有字符串组合Join的函数?? 原帖地址:http://bbs.51cto.com/thread-1133863-1.html 问题描述: VB 中有两个非常好用的字符串处理函数: Split(字符串,分隔符)作用:将[字符串]以[分隔符]作为边界,分解成数组. 返回:一个字符串数组. Join(字符数组,分隔符)作用:将[字符数组]中的元素,以[分隔符]作为边界,连接成一个字符串.返回:一个字符串. 请教老师们,SQL里是否有类似的函数? 解决方案:

【51CTO/BBS】请教: SQL里有没有字符串分解、组合的函数??

[51CTO/BBS]请教: SQL里有没有字符串分解.组合的函数?? 原帖地址:http://bbs.51cto.com/thread-1133863-1.html 问题描述: VB 中有两个非常好用的字符串处理函数: Split(字符串,分隔符)作用:将[字符串]以[分隔符]作为边界,分解成数组. 返回:一个字符串数组. Join(字符数组,分隔符)作用:将[字符数组]中的元素,以[分隔符]作为边界,连接成一个字符串.返回:一个字符串. 请教老师们,SQL里是否有类似的函数? 解决方案: 如

MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: Xml代码   <!-- 查询学生,根据id --> <select id="getStudent" parameterType="String" resultMap="studentResultMap"> SELECT ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX

SQL语句映射文件(1)resultMap

SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如: Xml代码 <mappers> <mapper resource="com/liming/manager/data/mappers/UserMapper.xml" /> <mapper resource="com/liming/manager/da

MyBatis学习 之 二、SQL语句映射文件(1)resultMap

SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如: Xml代码 <mappers> <mapper resource="com/liming/manager/data/mappers/UserMapper.xml" /> <mapper resource="com/liming/manager/da

sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取

原文:sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取 在多人开发中最头疼的是人少事多没有时间进行codereview,本来功能都没时间写,哪有时间来开会细细来分析代码.软件能跑就行,但是一些影响性能的语句写出来,有可能本人都不知道.找就更 麻烦了.幸亏sqlserver提供了工具可以导出执行语句进行分析.可以看看是哪些语句影响整体性能.工具叫sql server profiler,这玩意可以抓取实例上执行的所有语句\死锁\事物,为分析提供帮助. 开始->sqlserver目录-

【sql语句】好用的sql语句—适合自己熟悉陌生的数据库

这几天学习公司系统的数据流向.主要涉及到几个表的数据.但是表中的数据有上百万条,所以如果出现sql语句没有带条件的,会导致查询卡死,甚至出现内存溢出的情况.公司用到的数据库是sqlserver,所以下列的sql语句主要是针对sqlserver数据库的,其他数据库大同小异. 1.当我要熟悉数据库表结构的时候,我需要执行一个语句,这条语句能够查看数据库的很多信息,如列名,字段名,字段大小,字段类型等等....... select * from information_schema.columns w

Mysql性能优化----SQL语句优化、索引优化、数据库结构优化、系统配置优化、服务器硬件优化

一.SQL语句优化 1-1.MySQL慢日志 1).慢日志开启方式和存储格式 如何发现有问题的SQL? 使用Mysql慢日志对有效率问题的SQL进行监控 前期准备 mysql> show variables like '%log_queri%'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_no

二、SQL语句映射文件(2)增删改查、参数、缓存

2.2 select 一个select 元素非常简单.例如: Xml代码   <!-- 查询学生,根据id --> <select id="getStudent" parameterType="String" resultMap="studentResultMap"> SELECT ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX, ST.STUDENT_BIRTHDAY, ST