Sql server 调用SQL Server存储过程和将插入表中的文件中的一个变量
将VB2008中的存储过程调用到SQLServer数据库中。传递多个变量,其中一个是具有完整路径的文件名 我很难让存储过程获取文件并从中创建BLOB,然后将其插入表中的一个字段 传入变量: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
@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端读取二进制文件,然后以这种方式传递它。太棒了!很高兴你能让它正常工作