0

我已经阅读了一些关于 BCP 或 CLR 代码的艺术,它们会将 BLOB 导出到硬盘驱动器上的单个文件,但我需要将整个表数据一起 BCP 或 CLR(这意味着其他列是字符或整数或日期时间数据需要作为一个整体出来)我需要确保我可以 BCP/CLR 将数据返回到表中,并且在 BLOB 和其他列数据之间具有相同的链接。

有任何想法吗?

4

2 回答 2

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 访问它。

于 2013-08-01T11:53:21.807 回答
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
')
---------------------------------------------------------------
于 2013-08-01T11:43:45.110 回答