我试图通过从遗留访问系统导出用户数据来帮助我的安全。后端是SQL server 2000。我特别感兴趣的数据是用户照片,它以BLOB 形式存储在数据库中。
通过一些谷歌搜索,我找到了一个存储过程来帮助解决这个问题,但是当我尝试创建它时,我在将变量声明为
DECLARE @ImageData VARBINARY (max)
这一行也出现了类似的错误;
SELECT convert (VARBINARY (max), Face, 1)
我收到一条错误消息,指出“max”无效。在谷歌搜索了一些之后,我意识到服务器 2000 不接受“最大”,而是我使用了 8000,这是最大的 varbinary 大小。
我的导出在某种程度上起作用了,因为导出的图像数据只有前 8KB。显然,这是由于最大 varbinary 大小为 8000。图片本身对于图片的顶部来说是可以的,但之后只是平坦的灰色。
有没有办法把整个画面弄出来?我正在使用的存储过程如下;
CREATE PROCEDURE dbo.JB_Export_Photos (
@PicName NVARCHAR (100) -- name of picture in db USE cardID
,@ImageFolderPath NVARCHAR(1000) -- name of folder which will be saved to
,@Filename NVARCHAR(1000) -- filename after export add .jpg
)
AS
BEGIN
DECLARE @ImageData VARBINARY (max);
DECLARE @Path2OutFile NVARCHAR (2000);
DECLARE @Obj INT
SET NOCOUNT ON
SELECT @ImageData = (
SELECT convert (VARBINARY (max), Face, 1)
FROM picTable-- needs changing to real database name
WHERE picturename = @PicName -- 'pictureName' needs changing to match field in db, probably cardID
);
SET @Path2OutFile = CONCAT (
@ImageFolderPath
,'\'
, @Filename
);
BEGIN TRY
EXEC sp_OACreate 'ADODB.Stream' ,@Obj OUTPUT;
EXEC sp_OASetProperty @Obj ,'Type',1;
EXEC sp_OAMethod @Obj,'Open';
EXEC sp_OAMethod @Obj,'Write', NULL, @ImageData;
EXEC sp_OAMethod @Obj,'SaveToFile', NULL, @Path2OutFile, 2;
EXEC sp_OAMethod @Obj,'Close';
EXEC sp_OADestroy @Obj;
END TRY
BEGIN CATCH
EXEC sp_OADestroy @Obj;
END CATCH
SET NOCOUNT OFF
END
GO
提前致谢。
您应该使用批量复制程序 (BCP),它是 SQL Server 2000 附带的命令行实用程序,用于在 SQL Server 2000 数据库中导入和导出大量数据。
有关详细信息,请参阅数据库期刊文章 Utilize BCP with SQL Server 2000。