Обновите столбец varbinary последним файлом, используя столбец filepath из записи - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь обновить серию Document_Files, которые хранятся в следующей таблице.

Document_File :

  • 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 голосов
/ 21 ноября 2018

OPENROWSET не принимает параметры, поэтому ваша строка:

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

завершается сбоем как из-за того, что вы указали имя параметра, так и из-за того, что OPENROWSET не допускает параметры.

ДляПри таком подходе к работе вы должны использовать динамический SQL, то есть динамически создавать строку SQL и затем выполнять ее.

Вот пример .

...