我正在尝试使用存储过程将FileTable,FileName,FilePath参数化的情况下插入FileTable。我已经尝试过了但是它抛出一个错误


数据类型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

最佳答案

主要问题是动态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;

09-30 15:45
查看更多