【问题标题】:OPENROWSET - Implicit conversion from data type varchar to varbinary(max) is not allowed. Use the CONVERT function to run this queryOPENROWSET - 不允许从数据类型 varchar 到 varbinary(max) 的隐式转换。使用 CONVERT 函数运行此查询
【发布时间】:2018-04-30 05:26:02
【问题描述】:

您好,我正在尝试将存储过程的结果插入到名为 MyBinaryTable 的表中。 MyBinaryTable 包含两列:(FileId [type:int] 和 BulkColumn [type:varbinary(max)])。存储过程返回名为 FileId 和 BulkColumn 的两列。从存储过程中将值插入 MyBinaryTable 时,我遇到了这个错误:

Implicit conversion from data type varchar to varbinary(max) is not allowed. 
Use the CONVERT function to run this query.

这是我的存储过程:

CREATE PROCEDURE [dbo].[GenerateBinary] @Route VARCHAR(300), @FileId 
VARCHAR(10)
AS
Declare @sql varchar(max)
Set @sql='SELECT convert(varbinary(max),((SELECT BulkColumn FROM OPENROWSET( 
BULK ''' + @Route + ''' , SINGLE_BLOB) as Data)), 0) as ''BulkColumn'',''' + 
@FileId + ''' as ''FileId'''
Print @sql
Exec(@sql)

这是我插入值的方式:

INSERT INTO MyBinaryTable
EXEC GenerateBinary 'xyz.docx', @FileId = 254

【问题讨论】:

  • 标记您正在使用的 dbms。该代码是特定于产品的。
  • @jarlh 谢谢,我添加了以下标签 T-SQL & SQL-Server

标签: sql-server tsql stored-procedures implicit-conversion varbinarymax


【解决方案1】:

不要养成坏习惯。您没有在插入语句中指定列列表 - 这是一个坏习惯,也是我们错误的原因。您的过程的结果集是 [varbinary(max), varchar(10)]。这和你表的结构一样吗?不,您还强制使用定义为 varchar 的 fileid 参数进行另一个隐式转换。因此,更改您的过程以将 fileid 定义为 int 并在插入语句中指定列:

insert dbo.MyBinaryTable(BulkColumn, FileId)
select ...;

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多