![OPENROWSET、二进制文件、varchars 和 varbinaries](https://linux22.com/image/487409/OPENROWSET%E3%80%81%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E3%80%81varchars%20%E5%92%8C%20varbinaries.png)
我试图将二进制文件上传到 SQL Server,放入 varbinary 字段中。我想出了这个查询来执行此操作:
INSERT INTO Files(File, Name)
SELECT
"file.bin" AS Name
* FROM OPENROWSET(BULK 'C:\file.bin', SINGLE_BLOB) AS File
GO
但我收到了这个错误:
不允许从数据类型 varchar 隐式转换为 varbinary(max)。请使用 CONVERT 函数运行此查询。
如果我理解正确的话,它会将文件读取为文本 (varchar),而它是二进制文件,应该以二进制形式存储在 varbinary 上。我担心它可能会在此过程中破坏它,是吗?即使不会,我该如何使用 CONVERT 方法?
答案1
将数据按照与字段相同的顺序排列可以使其工作(或至少看起来工作正常):
INSERT INTO Files(File, Name)
SELECT
* FROM OPENROWSET(BULK 'C:\file.bin', SINGLE_BLOB) AS File
"file.bin" AS Name
GO
答案2
我自己从来没有这样做过,但是我发现这一页 显示将 jpg 插入 varbinaries 的相同过程...唯一的区别是路径名前的 N 并且没有 AS 开关
希望这有帮助,但我可能遗漏了与转换有关的内容
答案3
我不确定为什么会返回 varchar 列。看起来与msdn 中的示例。
我不知道您如何转换该列。也许吧...
SELECT
convert(varbinary(max), * FROM OPENROWSET(BULK 'C:\file.bin', SINGLE_BLOB)) AS File
但是,当您指定SINGLE_BLOB时,我更关心它是否是varchar。