? /*--利用 textcopy.exe文件實現在 數據庫 中存儲/讀取文件 需要textcopy.exe文件,該文件可以在 sql 7.0安裝光盤找到 --轉貼自大力--*/ --建立存取處理的存儲過程 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_textcopy]') a
/*--利用 textcopy.exe文件實現在
數據庫中存儲/讀取文件
需要textcopy.exe文件,該文件可以在
sql 7.0安裝光盤找到
--轉貼自大力--*/
--建立存取處理的存儲過程
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_textcopy]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_textcopy]
GO
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) --I 為存儲到數據庫,O 從數據庫中讀出成文件
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
--調用示例:
--1.創建示例表和初始化數據
create table tb(id int,img image)
insert tb
select 1,0x
union all select 2,0x
go
--2.將文件保存到數據庫中
declare @srv varchar(255),@db sysname,@tb sysname,@col sysname
select @srv=@@servername --
服務器名
,@db=db_name() --數據庫名
,@tb='tb' --表名
,@col='img' --列名
sp_textcopy @srv,'sa','sa的密碼',@db,@tb,@col,'c:\test.jpg','where id=1','I' --保存到id=1的記錄中,注意條件是:id=1
sp_textcopy @srv,'sa','sa的密碼',@db,@tb,@col,'c:\test.doc','where id=2','I' --保存到id=2的記錄中,注意條件是:id=2
--3.從數據庫中讀出保存為文件
sp_textcopy @srv,'sa','sa的密碼',@db,@tb,@col,'c:\test.jpg','where id=1','O' --讀出id=1的記錄,注意條件是:id=1
sp_textcopy @srv,'sa','sa的密碼',@db,@tb,@col,'c:\test.doc','where id=2','O' --讀出id=2的記錄,注意條件是:id=2
--刪除
測試環境drop table tb
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_textcopy]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_textcopy]
*******************
?
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_binaryIO]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_binaryIO]
GO
/*--bcp 實現二進制文件的導入導出
支持image,text,ntext字段的導入/導出
image適合于二進制文件,包括:Word文檔,Excel文檔,圖片,音樂等
text,ntext適合于文本數據文件
注意:導入不會新增記錄,所以導入前要對表進行初始化,即插入記錄
導入時,將覆蓋滿足條件的所有行
導出時,將把所有滿足條件的行導出到指定文件中
此存儲過程僅用bcp實現
--鄒建 2003.08(引用請保留此信息)---*/
/*--調用示例
--數據導出
exec p_binaryIO 'zj','','','a
clearcase/" target="_blank" >cc_演示數據..tb','img','c:\zj1.dat'
--數據導入
exec p_binaryIO 'zj','','','acc_演示數據..tb','img','c:\zj1.dat','',0
--*/
Create proc p_binaryIO
@servename varchar (30),--服務器名稱
@username varchar (30), --用戶名
@password varchar (30), --密碼
@tbname varchar (500), --數據庫..表名
@fdname varchar (30), --字段名
@fname varchar (1000), --目錄+文件名,處理過程中要使用/覆蓋:@filename+_temp
@tj varchar (1000)='', --處理條件.對于數據導入,如果條件中包含@fdname,請指定表名前綴
@isout bit=1 --1導出((默認),0導入
AS
declare @fname_in varchar(1000) --bcp處理應答文件名
,@fsize varchar(20) --要處理的文件的大小
,@m_tbname varchar(50) --臨時表名
,@sql varchar(8000)
--則取得導入文件的大小
if @isout=1
set @fsize='0'
else
begin
create table #tb(可選名 varchar(20),大小 int
,創建日期 varchar(10),創建時間 varchar(20)
,上次寫操作日期 varchar(10),上次寫操作時間 varchar(20)
,上次訪問日期 varchar(10),上次訪問時間 varchar(20),特性 int)
insert into #tb
exec master..xp_getfiledetails @fname
select @fsize=大小 from #tb
drop table #tb
if @fsize is null
begin
print '文件未找到'
return
end
end
--生成數據處理應答文件
set @m_tbname='[##temp'+cast(newid() as varchar(40))+']'
set @sql='select * into '+@m_tbname+' from(
select null as 類型
union all select 0 as 前綴
union all select '+@fsize+' as 長度
union all select null as 結束
union all select null as 格式
) a'
exec(@sql)
select @fname_in=@fname+'_temp'
,@sql='bcp "'+@m_tbname+'" out "'+@fname_in
+'" /S"'+@servename
+case when isnull(@username,'')='' then ''
else '" /U"'+@username end
+'" /P"'+isnull(@password,'')+'" /c'
exec master..xp_cmdshell @sql
--刪除臨時表
set @sql='drop table '+@m_tbname
exec(@sql)
if @isout=1
begin
set @sql='bcp "select top 1 '+@fdname+' from '
+@tbname+case isnull(@tj,'') when '' then ''
else ' where '+@tj end
+'" queryout "'+@fname
+'" /S"'+@servename
+case when isnull(@username,'')='' then ''
else '" /U"'+@username end
+'" /P"'+isnull(@password,'')
+'" /i"'+@fname_in+'"'
exec master..xp_cmdshell @sql
end
else
begin
--為數據導入準備臨時表
set @sql='select top 0 '+@fdname+' into '
+@m_tbname+' from ' +@tbname
exec(@sql)
--將數據導入到臨時表
set @sql='bcp "'+@m_tbname+'" in "'+@fname
+'" /S"'+@servename
+case when isnull(@username,'')='' then ''
else '" /U"'+@username end
+'" /P"'+isnull(@password,'')
+'" /i"'+@fname_in+'"'
exec master..xp_cmdshell @sql
--將數據導入到正式表中
set @sql='update '+@tbname
+' set '+@fdname+'=b.'+@fdname
+' from '+@tbname+' a,'
+@m_tbname+' b'
+case isnull(@tj,'') when '' then ''
else ' where '+@tj end
exec(@sql)
--刪除數據處理臨時表
set @sql='drop table '+@m_tbname
end
--刪除數據處理應答文件
set @sql='del '+@fname_in
exec master..xp_cmdshell @sql
go