2016-11-23 73 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

相關問題