使用记录中的文件路径列将varbinary列更新为最新文件

时间:2018-11-21 00:49:32

标签: sql-server tsql sql-update bulk-load varbinarymax

我正在尝试更新存储在下表中的一系列Document_Files。

文档文件

  • FileID int
  • TypeID int
  • FilePath nvarchar(255)
  • FileData varbinary(max)

我正在尝试使用FileData为特定类型的每条记录更新FilePath列,以找到要导入的BLOB。

我可以使用以下内容一次更新它们:

UPDATE Document_File
SET FileData = (SELECT * FROM OPENROWSET(
    BULK 'C:\Reports\Report - District1.xlsx', SINGLE_BLOB) AS T)
    WHERE FileID = 123456

我尝试使用以下方法遍历所需文件类型的一系列记录:

DECLARE @MyFile varchar(100)
DECLARE @LoopCounter int
DECLARE @FileID varchar(255)
DECLARE @isExists int

SET @LoopCounter = (SELECT COUNT(FilePath) FROM Document_File WHERE TypeID = 123)
SET @FileID = (SELECT TOP 1 FileID FROM Document_File WHERE TypeID = 123) -1

WHILE @LoopCounter > 0
BEGIN
    SET @MyFile = (SELECT TOP 1 FilePath FROM Document_File WHERE TypeID = 123 
        AND FileID > @FileID)
    EXEC master.dbo.xp_fileexist @MyFile, @isExists OUTPUT

    IF(@isExists = 1)
        BEGIN TRY
            BEGIN TRAN
                UPDATE Document_File
                SET FileData = (SELECT * FROM OPENROWSET(BULK N'@MyFile', SINGLE_BLOB) AS T)
                WHERE TypeID = 123 AND FileID > @FileID
        END TRY
        BEGIN CATCH
            IF @@TRANCOUNT > 0 BEGIN
            ROLLBACK TRAN
            END
        END CATCH

        IF @@TRANCOUNT > 0  BEGIN
        COMMIT TRAN
    END 

SET @LoopCounter = @LoopCounter -1
SET @FileID = @FileID +1

END

我收到一个错误提示:

  

无法批量加载。文件“ @MyFile”不存在

有人知道我在做什么,是否有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

OPENROWSET不接受参数,因此您的行:

(SELECT * FROM OPENROWSET(BULK N'@MyFile', SINGLE_BLOB)

失败,原因是您已经引用了参数名称,也因为OPENROWSET不允许使用参数。

要使此方法起作用,您必须使用动态SQL,即动态构建SQL字符串,然后执行它。

这里是example