如何使用sql server management studio将blob插入数据库

问题描述 投票:48回答:6

如何轻松地将blob插入varbinary(MAX)字段?

举个例子:

我要插入的是:c:\ picture.png 桌子是mytable 该列是mypictureblob 这个地方是recid = 1

sql sql-server sql-server-2005 blob
6个回答
64
投票

您可以使用SQL Server Management Studio中的T-SQL插入varbinary(max)字段,特别是使用OPENROWSET命令。

例如:

INSERT Production.ProductPhoto 
(
    ThumbnailPhoto, 
    ThumbnailPhotoFilePath, 
    LargePhoto, 
    LargePhotoFilePath
)
SELECT ThumbnailPhoto.*, null, null, N'tricycle_pink.gif'
FROM OPENROWSET 
    (BULK 'c:\images\tricycle.jpg', SINGLE_BLOB) ThumbnailPhoto

请查看以下文档以获取一个好的示例/演练

Working With Large Value Types

请注意,在这种情况下,文件路径是相对于目标SQL服务器而不是运行此命令的客户端。


15
投票

MSDN有一篇文章Working With Large Value Types,试图解释导入部分如何工作,但它可能会有点混乱,因为它同时做两件事。

在这里,我提供了一个简化版本,分为两部分。假设以下简单表:

CREATE TABLE [Thumbnail](
   [Id]        [int] IDENTITY(1,1) NOT NULL,
   [Data]      [varbinary](max) NULL
CONSTRAINT [PK_Thumbnail] PRIMARY KEY CLUSTERED 
(
[Id] ASC
) ) ON [PRIMARY]

如果您运行(在SSMS中):

SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X

它将显示,结果看起来像一个名为BulkColumn的列的表。这就是为什么你可以在INSERT中使用它,如:

INSERT [Thumbnail] ( Data )
SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X

其余的只是将它装入一个包含更多列的插页中,您的表可能有也可能没有。如果你命名select FOO的结果,那么你可以在表格中的其他字段的常量之后使用SELECT Foo.BulkColumnas

可能变得更棘手的部分是如何将该数据导回到文件中,以便您可以检查它是否仍然正常。如果你在cmd行上运行它:

bcp "select Data from B2B.dbo.Thumbnail where Id=1" 
queryout D:\T\TestImage1_out2.dds -T -L 1 

它将开始抱怨4个额外的“参数”,并会产生误导性的默认值(这将导致更改的文件)。你可以接受第一个,将第二个设置为0,然后设置第三个和第四个,或者显式:

输入字段Data [varbinary(max)]的文件存储类型: 输入字段数据[8]的前缀长度:0 输入字段数据[0]的长度: 输入字段终止符[无]:

然后会问:

是否要将此格式信息保存在文件中? [是/否] y 主机文件名[bcp.fmt]:C:\ Test \ bcp_2.fmt

下次你必须运行它添加-f C:\Test\bcp_2.fmt它会停止抱怨:-)节省大量的时间和悲伤。


8
投票

使用SQL选择BLOB有两种方法:

SELECT * FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a

以及:

SELECT BulkColumn FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a

请注意FROM子句后的相关名,这是必需的。

然后你可以通过执行INSERT SELECT来INSERT。

您也可以使用第二个版本进行更新,如我在How To Update A BLOB In SQL SERVER Using TSQL中所述。


2
投票

但是,您只需在SQL Server计算机上从磁盘读取文件:

select * from openrowset (bulk 'c:\path\filename.ext',single_blob) a

在管理应用程序中以十六进制形式(Management Studio)查看它。

因此,您可以,例如,将数据库备份到文件(本地服务器上),然后通过上面的语句将其下载到其他位置。


1
投票

你需要从mgmt工作室做吗?以下是我们如何从cmd行执行此操作:

“C:\ Program Files \ Microsoft SQL Server \ MSSQL \ Binn \ TEXTCOPY.exe”/ S <Server> / D <DataBase> / T mytable / C mypictureblob / F“C:\ picture.png”/ W“其中RecId =“/我


0
投票

好的......这让我花了太长时间。 sql-management studio工具不仅仅是这样的简单事情(我之前在寻找设置查询超时的位置时注意到了这一点,它在4个不同的位置完成)

我下载了一些其他的sql编辑器包(在我的情况下是sql maestro)。并且它包含一个blob编辑器,您可以在其中查看blob,并将新blob加载到这些字段中。

谢谢你的意见!

© www.soinside.com 2019 - 2024. All rights reserved.