我已经阅读了一些关于将BOB或CLR代码导出到硬盘驱动器上的单个文件的艺术,但我需要将整个表数据BCP或CLR一起输出(意味着其他列是字符或整数或日期时间数据需要作为一个整体出来)我需要确保我可以将数据BCP / CLR重新放回到表中,并在BLOB和其他列数据之间进行相同的链接。
有什么想法吗?
答案 0 :(得分:2)
我不确定我是否理解你的要求,所以我会尝试涵盖两个案例。
首先,如果您想将所有数据(包括varbinary blob)导出到一个文件中,您可以这样做。这是一个与您的表一起使用的测试脚本。您必须在SSMS中打开SQLCMD模式。然后发出这个脚本:
-- create target structure same as source
select top 0 *
into YourTbl2
from YourTbl
-- first line makes BCP dump to file, second line imports it to target structure
!!bcp YourDb.dbo.YourTbl out "D:\Temp\BlobTest.bak" -T -c
!!bcp YourDb.dbo.YourTbl2 in "D:\Temp\BlobTest.bak" -T -c
-- test if everything is imported
select * from Playground.dbo.BlobTest
except
select * from Playground.dbo.BlobTest2
如果您只想将单个文件导出到SQL Server所在的磁盘,您可以使用:
!!bcp "SELECT TOP 1 YourBlob FROM YourDb.dbo.YourTbl" queryout "D:\Temp\YourFile.xyz" -T -c
如果适用,您可以共享导出blob的文件夹,并从客户端PC访问它。
答案 1 :(得分:0)
您可以执行以下操作: 您可以使用图像数据类型来保存任何文件。 并且,请仔细阅读以下内容以便了解。 我在我们的项目中实现了这一点。简单而充满活力。 你只需要打电话:
Insert [tblTemp] (imageType,ImageFile) Select '.PDF',BulkColumn from Openrowset( Bulk 'C:\mak\A.PDF', Single_Blob) as tb
插入表格和 您可以使用:
WriteBinaryToDisc 'C:\NEWF\','MAK','.PDF','DOC_TABLE','DOC_ID','DOC_IMAGE','WHERE DOC_ID=''25'''
使用指定的位置和扩展名回写文件系统。
我使用tblTemp来保存所有文件。
--FIRST CHANGE THE CONFIGURATION TO ACTIVATE THIS FEATURE
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ole Automation Procedures';
GO
--HOW TO WRITE FILES TO DIRECTLY SQL SERVER FROM DISC
CREATE TABLE [dbo].[tblTemp](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ImageType] [varchar] (10) NULL,
[ImageFile] [image] NULL
) ON [PRIMARY]
Insert [tblTemp] (imageType,ImageFile) Select '.PDF',BulkColumn from Openrowset( Bulk 'C:\mak\A.PDF', Single_Blob) as tb
-----------------------------------------------------
--HOW TO WRITE FILE TO DISC FROM SQL SERVER
--WriteBinaryToDisc 'C:\NEWF\','MAK','.PDF','DOC_TABLE','DOC_ID','DOC_IMAGE','WHERE DOC_ID=''25'''
ALTER PROCEDURE WriteBinaryToDisc
(
@Path VARCHAR(255),
@Filename VARCHAR(100),
@FileExt VARCHAR(4),
@TblName varchar(50),
@IDField VARCHAR(50),
@ImageField VARCHAR(50),
@WHERE VARCHAR(300)
)
AS
set nocount on
EXEC ('
DECLARE @SOURCEPATH VARBINARY(MAX),
@DESTPATH VARCHAR(MAX),
@ObjectToken INT,
@image_ID BIGINT
DECLARE IMGPATH CURSOR FAST_FORWARD FOR SELECT '+@ImageField+','+@IDField+' from '+@TblName+' '+@WHERE+'
OPEN IMGPATH
FETCH NEXT FROM IMGPATH INTO @SOURCEPATH, @image_ID
WHILE @@FETCH_STATUS = 0
BEGIN
SET @DESTPATH = '''+@Path+'\'+@Filename+'''+ CAST(@image_ID AS varchar)+'''+@FileExt+'''
EXEC sp_OACreate ''ADODB.Stream'', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken, ''Type'', 1
EXEC sp_OAMethod @ObjectToken, ''Open''
EXEC sp_OAMethod @ObjectToken, ''Write'', NULL, @SOURCEPATH
EXEC sp_OAMethod @ObjectToken, ''SaveToFile'', NULL, @DESTPATH, 2
EXEC sp_OAMethod @ObjectToken, ''Close''
EXEC sp_OADestroy @ObjectToken
FETCH NEXT FROM IMGPATH INTO @SOURCEPATH, @image_ID
END
CLOSE IMGPATH
DEALLOCATE IMGPATH
')
---------------------------------------------------------------