gpt4 book ai didi

sql-server - 将图像列导出到 sql server 中的 pdf 文件?

转载 作者:行者123 更新时间:2023-12-03 08:24:36 26 4
gpt4 key购买 nike

我正在尝试从 SQL Server 导出数据类型为“image”的列。我使用了如下所示的代码。代码运行成功,但我没有看到输出文件。请让我知道这里可能有什么问题。

 DECLARE @x INT
declare @file varbinary(max)
set @file = (select convert(varbinary(max),fileContent) from table where submit_id = 123)
declare @filePath varchar(1024)
set @filePath = 'C:\Users\myusername\test.pdf'
EXEC sp_OACreate 'ADODB.Stream', @x OUTPUT
EXEC sp_OASetProperty @x, 'Type', 1
EXEC sp_OAMethod @x, 'Open'
EXEC sp_OAMethod @x, 'Write', NULL, @file
EXEC sp_OAMethod @x, 'SaveToFile', NULL, @filePath, 2
EXEC sp_OAMethod @x, 'Close'
EXEC sp_OADestroy @x

谢谢

最佳答案

我正在回答这个问题,因为我找到了一种更快的方法。

从命令行使用 bcp(批量复制程序)实用程序可以保留 native 文件格式并且速度非常快。输出文件也可以写入本地目录。此外,如果需要,可以自定义文件格式。

编辑:使用我使用的代码添加更详细的答案版本。

1) 设置执行xp_cmdshell所需的权限。

EXEC sp_configure 'show advanced options', 1;  
GO
RECONFIGURE;
GO
EXEC sp_configure 'xp_cmdshell',1
GO
RECONFIGURE;
GO

2) 使用bcp

导出表格的格式文件
bcp schemaname.tablename format nul -T -n -f format_file_tablename.fmt

如果您不使用集成安全连接到数据库,请将 -T 替换为 -S servername -d databasename -U username -P password

3) 成功导出格式文件后,编辑它以删除除 imagevarbinary 列之外的所有其他列。

格式文件最初看起来像这样。

11.0
17
1 SQLNCHAR 2 200 "" 1 Name SQL_Latin1_General_CP1_CI_AS
2 SQLNCHAR 2 1000 "" 2 Description SQL_Latin1_General_CP1_CI_AS
3 SQLUNIQUEID 1 16 "" 3 GUID ""
4 SQLBIT 1 1 "" 4 Enabled ""
5 SQLNCHAR 2 600 "" 5 ClassType SQL_Latin1_General_CP1_CI_AS
6 SQLINT 0 4 "" 6 PartitionID ""
7 SQLBIT 1 1 "" 7 Protected ""
8 SQLDATETIME 1 8 "" 8 LastModifiedTime ""
9 SQLINT 0 4 "" 9 LastModifiedByID ""
10 SQLINT 0 4 "" 10 ImageType ""
11 SQLBIT 1 1 "" 11 Template ""
12 SQLINT 0 4 "" 12 ObjectID ""
13 SQLBINARY 8 0 "" 13 Image --column of interest ""
14 SQLINT 0 4 "" 14 ParentId ""
15 SQLNCHAR 2 600 "" 15 ParentClassType SQL_Latin1_General_CP1_CI_AS
16 SQLBIT 1 1 "" 16 IsPrimary ""
17 SQLDATETIME 1 8 "" 17 ImageCaptureDate ""

我编辑了如下文件。

11.0
1
1 SQLBINARY 0 0 "" 1 Image ""

4) 然后我不得不遍历表中的行,以将每行中的图像列提取为一个文件。为此,我使用了一个临时表

IF OBJECT_ID('dbo.tmp_for_picture', 'U') IS NOT NULL
DROP TABLE tmp_for_picture
GO
select
row_number() over(order by parentid) as rownum
,i.image as image_column
,i.parentid
,replace(p.name,',','') as picture_file_name
,i.name
into tmp_for_picture
from Images i
join personnel p on p.ObjectID = i.ParentId
GO
declare @cnt int
declare @i int
declare @filename varchar(512)
declare @extension varchar(20)
declare @sql varchar(4000)
set @cnt = (select count(*) from Images i join personnel p on p.ObjectID = i.ParentId)
set @i = 1
set @extension = '.jpeg' --or extract the extension from a column in the table if available

while @i <= @cnt
begin
--print @i
set @filename = (select picture_file_name from tmp_for_picture where rownum = @i)
set @sql = 'bcp "select image_column from tmp_for_picture where rownum = '+str(@i)+'" queryout "F:\pictures\'+@filename+@extension+'" -f formatfile.fmt -S servername -d databasename -T'
--print @sql
exec xp_cmdshell @sql
set @i = @i+1
end
GO

上述步骤可用于从数据库中提取任何类型的图像/varbinary 文件(存储为 pdf、docx 等)。

关于sql-server - 将图像列导出到 sql server 中的 pdf 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30900442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com