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

举个例子:

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

有帮助吗?

解决方案

您可以使用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

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

使用大值类型

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

其他提示

MSDN有一篇文章使用大值类型,  试图解释导入部分如何工作,但它可能会有点混乱,因为它同时做两件事。

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

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个<!> quot; params <!> quot;并会给出误导性的默认值(这将导致更改的文件)。您可以接受第一个,将第二个设置为0,然后设置第三个和第四个,或者显式:

  

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

然后会问:

  

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

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

使用TSQL选择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来插入它。

您还可以使用第二个版本进行更新,如我在如何使用TSQL更新SQL SERVER中的BLOB

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

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

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

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

你需要从mgmt工作室做吗?以下是我们从cmd行开始的方式:

<!>“C:\ Program Files \ Microsoft SQL Server \ MSSQL \ Binn \ TEXTCOPY.exe <!>”; / S <!> lt;服务器GT <!>; / D <!> lt;数据库GT <!>; / T mytable / C mypictureblob / F <!>“C:\ picture.png <!>”; / W <!> quot;其中RecId = <!> quot; / I

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

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

感谢您的投入!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top