【发布时间】:2009-10-29 13:12:38
【问题描述】:
如何轻松地将 blob 插入 varbinary(MAX) 字段?
举个例子:
我要插入的是:c:\picture.png
表是 mytable
专栏是 mypictureblob
这个地方是recid=1
【问题讨论】:
标签: sql sql-server sql-server-2005 blob
如何轻松地将 blob 插入 varbinary(MAX) 字段?
举个例子:
我要插入的是:c:\picture.png
表是 mytable
专栏是 mypictureblob
这个地方是recid=1
【问题讨论】:
标签: sql sql-server sql-server-2005 blob
您可以在 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 服务器的,而不是您运行此命令的客户端。
【讨论】:
MSDN有一篇文章Working With Large Value Types, 它试图解释导入部分是如何工作的,但它可能会有点混乱,因为它同时做两件事。
这里我提供了一个简化版本,分为 2 个部分。假设如下简单表格:
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.BulkColumn 和 as。
更棘手的部分是如何将数据导出回文件中,以便您检查它是否仍然正常。如果你在命令行上运行它:
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] 的长度:
输入字段终止符 [无]:
然后它会问:
您想将此格式信息保存在文件中吗? [是/否] 是
主机文件名 [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 将其插入。
您还可以使用第二个版本进行更新,正如我在 How To Update A BLOB In SQL SERVER Using TSQL 中描述的那样。
【讨论】:
但是,您可以简单地从 SQL 服务器机器上的磁盘读取文件:
select * from openrowset (bulk 'c:\path\filename.ext',single_blob) a
以十六进制形式在管理应用程序中查看它(Management Studio)。
因此,例如,您可以将数据库备份到文件(本地在服务器上),然后通过上述语句将其下载到其他地方。
【讨论】:
您需要在 mgmt studio 中进行操作吗?以下是我们从 cmd 行执行此操作的方法:
"C:\Program Files\Microsoft SQL Server\MSSQL\Binn\TEXTCOPY.exe" /S /D /T mytable /C mypictureblob /F "C:\picture.png" /W "在哪里 RecId=" /I
【讨论】:
好吧...这花了我太长时间了。 sql-management studio 工具不能胜任这样简单的事情(我之前在寻找设置查询超时的位置时注意到了这一点,并且它在 4 个不同的位置完成)
我下载了一些其他的 sql 编辑器包(在我的例子中是 sql maestro)。瞧,它包含一个 blob 编辑器,您可以在其中查看 blob,并将新 blob 加载到这些字段中。
感谢您的意见!
【讨论】: