数据类型VARCHAR和VARBINARY(MAX)在添加操作员中不兼容



我试图使用存储过程插入可案例的插入,其中我的文件截图,文件名,filepath将被参数化。我已经尝试过,但它引发了一个错误

数据类型varchar和varbinary(max)在添加操作员中不兼容

我的存储过程:

    @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

主要问题是动态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,则整个字符串将被无效..

如果您需要在动态SQL中使用变量,那将是在动态SQL中的语句中传递一个值或从中检索值,则需要使用sp_executesql和@params。以下是充分处理和测试的示例。动态SQL语句中的@file变量"映射"到存储过程中的@file变量。SP_EXECUTESQL知道将您的@file变量填充您的@file变量,其中任何动态SQL中的@file变量中的任何内容。请注意,即使这些命名相同,它们也是不同的变量。如果您来自.NET,那么动态SQL就像.NET中的方法一样,它具有自己的变量范围。如果这使事情变得更清晰,则可以在Dynamic 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;

最新更新