我正在尝试使用存储过程将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;