2016-11-23 39 views
3

我试图使用存储过程,其中我的FileStream,文件名,文件路径将会被参数插入到一个不兼容的FileTable。我曾经试过,但它抛出一个错误的数据类型为varchar和varbinary(最大值)都在增加操作符

的数据类型为varchar和varbinary(最大值)都在增加操作符

我的存储过程不兼容:

@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 
+0

你在突入@file? – scsimon

+0

这是一个错误,我已经更新了这个问题。 – MaazKhan47

+0

我不确定你的目标是在这里,但是FWIW你不需要将@file转换成你已经声明的那样'convert(VARBINARY(MAX),'+ @file +')' – scsimon

回答

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整个字符串将被清零..

如果需要使用内部动态变量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; 
+0

请你解释一下吗? – MaazKhan47

+0

我已经添加了更多解释。另请参阅本文中的“替换参数值”:https://technet.microsoft.com/zh-cn/library/ms175170(v=sql.105).aspx – under

+0

非常有帮助(Y) – MaazKhan47

相关问题