【问题标题】:The data types varchar and varbinary(max) are incompatible in the add operator数据类型 varchar 和 varbinary(max) 在 add 运算符中不兼容
【发布时间】:2017-04-07 21:47:13
【问题描述】:

我正在尝试使用存储过程插入 FileTable,其中我的 FileStream、FileName、FilePath 将被参数化。我已经尝试过了,但它会引发错误

数据类型 varchar 和 varbinary(max) 在 add 运算符中不兼容

我的存储过程:

    @filePath VARCHAR(100),
    @fileName VARCHAR(100)
AS
BEGIN
    DECLARE @file VARBINARY(MAX)
    DECLARE @sql NVARCHAR(max)

    SET @sql = 'SELECT'+ @file +' = CAST(bulkcolumn AS VARBINARY(MAX)) FROM OPENROWSET(BULK '+ @filePath +', SINGLE_BLOB) AS x'

    EXEC(@Sql);

    INSERT INTO dbo.FileStore(name, file_stream)
        SELECT @fileName, @file
END

【问题讨论】:

  • 你向@file 传递了什么?
  • 这是一个错误,我已经更新了问题。
  • 我不确定您的目标是什么,但FWIW您不需要将@file 转换为您声明为convert(VARBINARY(MAX),'+ @file +')的内容@
  • 我也刚刚更新了:D
  • 错误仍然存​​在?

标签: sql .net sql-server stored-procedures parameters


【解决方案1】:

主要问题在于动态 SQL 中的 @file 变量。

SET @sql = 'SELECT'+ @file +' = CAST(bulkcolumn AS VARBINARY(MAX)) FROM OPENROWSET(BULK '+ @filePath +', SINGLE_BLOB) AS x'

执行此操作时,@file 变量将替换为变量的内容。所以如果@file 包含空字符串(''),这将被解析为:

SELECT  = CAST(bulkcolumn....

如果@file 为NULL,则整个字符串将被NULL。

如果需要在动态 SQL 中使用变量,即向动态 SQL 中的语句传递值或从中检索值,则需要使用 sp_executeSQL 和 @params。下面是完全制定和测试的例子。动态 SQL 语句中的 @file 变量“映射”到存储过程中的 @file 变量。 sp_executeSQL 知道用动态 SQL 中 @file 变量中的任何内容填充您的 @file 变量。请注意,即使这些名称相同,它们也是不同的变量。如果您来自 .Net,动态 SQL 就像 .net 中的一种方法,它有自己的变量范围。如果它能让事情更清楚,您可以在动态 SQL 中为 @file 变量使用不同的名称。

declare @filePath VARCHAR(100) = 'insert full path'
     , @fileName VARCHAR(100) = 'insert file name';
DECLARE @file VARBINARY(MAX);
DECLARE @sql NVARCHAR(max);
declare @params nvarchar(max);


set @sql = N'SET @file = (SELECT BulkColumn FROM OPENROWSET(BULK N''' + @filePath + ''', SINGLE_BLOB) AS x)';
set @params = N'@file varbinary(max) OUTPUT';

print @sql;

EXEC sp_executesql @sql, @params, @file = @file OUTPUT;
select @file;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2017-03-23
  • 1970-01-01
相关资源
最近更新 更多