Sql server 调用SQL Server存储过程和将插入表中的文件中的一个变量

Sql server 调用SQL Server存储过程和将插入表中的文件中的一个变量,sql-server,Sql Server,将VB2008中的存储过程调用到SQLServer数据库中。传递多个变量,其中一个是具有完整路径的文件名 我很难让存储过程获取文件并从中创建BLOB,然后将其插入表中的一个字段 传入变量: @myProduct Varchar(20), @myVersion Varchar(20), --@myFileName Varchar(50), @myPath Varchar(100), @myStatus Va

将VB2008中的存储过程调用到SQLServer数据库中。传递多个变量,其中一个是具有完整路径的文件名

我很难让存储过程获取文件并从中创建BLOB,然后将其插入表中的一个字段

传入变量:

    @myProduct      Varchar(20),
    @myVersion      Varchar(20),
    --@myFileName   Varchar(50),
    @myPath         Varchar(100),
    @myStatus       Varchar(15),
    @myDeviceType   VarChar(50),
    @myAction       Varchar(50),
    @shortName      Varchar(50),
    @myBlob         VarBinary(Max)
以下是插页:

INSERT INTO schema.tablename
VALUES (@myProduct, @myVersion, @myAction, NULL,
        @myPath, @myBlob, myDeviceType, @Shortname)
我试着把

SELECT BulkColumn 
FROM OPENROWSET (BULK @myblob, SINGLE_CLOB) @lBlob 
并使用
@lBlob
更改
@myBlob

我得到:

不支持从数据类型varchar到varbinary(max)的隐式转换 允许。使用CONVERT函数运行此查询


有什么帮助吗?

我必须阅读获取文件内容的代码,但看起来您正在以字符串形式检索文件内容并将其传递给存储过程。然后,该语句尝试将字符串插入二进制字段,但由于数据类型无效而失败。在insert语句中,可以执行以下操作:

INSERT INTO schema.tablename
VALUES (
  @myProduct,
  @myVersion,
  @myAction,
  NULL,
  @myPath,
  CONVERT(varbinary(MAX),@myBlob),
  myDeviceType,
  @Shortname
)
如果您无权更改insert语句,还可以在将字符串传递到存储过程之前将其转换为二进制数据类型

另一个选项是将表上的数据类型从varbinary(max)更改为varchar(max),这样就不必管理任何转换


如果您真的想变得圆滑,还可以查看Sql Server文件流()。使用文件流,您可以从数据库中传递和检索文件。它将存储在数据库之外的文件系统中,数据库将在内部维护有关该文件的元数据

读取代码时,您似乎正在将
varbinary
数据类型传递给
varchar
列数据类型。请检查您的列数据类型

如果您不想转换
@myBlob
,那么也必须将列数据类型设置为
varbinary
。。因为您将变量
@myBlob
声明为
varbinary
,或者您可以将变量声明的数据类型从
varbinary
更改为
varchar

3种纠正方法

  • 将变量
    @myBlob
    转换为
    varchar

    CONVERT(varchar(max), @myBlob) or CAST(@myBlob AS varchar(max))
    
    DECLARE @myBlob VARCHAR(MAX)
    
  • 将列数据类型从
    varchar
    更改为
    varbinary

  • 将变量声明的数据类型更改为
    varchar

    CONVERT(varchar(max), @myBlob) or CAST(@myBlob AS varchar(max))
    
    DECLARE @myBlob VARCHAR(MAX)
    

  • 关于

    列的数据类型是什么?我建议在
    INSERT
    语句中始终明确指定要插入的列-这样,您就可以匹配哪些值应该进入哪个列,并且应该非常清楚错误发生的位置。还可以使您的代码更加健壮,因为对基础表的更改不会破坏所有
    INSERT
    语句……谢谢。我继续从VB端读取二进制文件,然后以这种方式传递它。太棒了!很高兴你能让它正常工作