Невозможно выполнить массовую загрузку. Файл «‘ @imagepath ‘» не существует или у вас нет прав доступа к файлу

#sql #sql-server #file-upload

#sql #sql-server #загрузка файла

Вопрос:

Я пытаюсь вставить изображение в SQL server, но я получил эту ошибку :

Невозможно выполнить массовую загрузку. Файл «‘ @imagepath ‘» не существует или у вас нет прав доступа к файлу.

 Create procedure insert_test
AS
BEGIN
INSERT test(
   Id,
logo

)
     VALUES (
         @Id,
(SELECT  BulkColumn
    FROM Openrowset(Bulk '''  @imagepath  ''', Single_Blob) as img),
END
  

Код выполнения

 EXEC    @return_value = [dbo].[test_insert]
    @Id = N'0001',
    @imagepath = 'D:\heart.png',

SELECT  'Return Value' = @return_value

GO
  

Как я могу исправить эту ошибку?

Обновить :

Это пример процедуры, которую я создал для его использования:

 USE [SysTest]
GO


ALTER PROCEDURE [dbo].[userinformations_insert]
@UserId nvarchar(55),
@UserName nvarchar(max),
@UserPhone int ,
@UserAdress int,
@UserEmail nvarchar(50),
@imagepath nvarchar(100),


AS
BEGIN

IF EXISTS ( SELECT 1 from User)
BEGIN

   update User  set userPicture = (SELECT  BulkColumn
        FROM Openrowset(Bulk '''  @imagepath  ''', Single_Blob) as img) , userEmail = @userEmail, userPhone = @userPhone, userAdress = @userAdress where userId =@UserId
END
ELSE
BEGIN
    INSERT User(
    userId,
    UserName ,
    userPicture
    userEmail,
    userPhone,
    userAdress,
    )
         VALUES (
             @UserId,
    @UserName ,
    (SELECT  BulkColumn
        FROM Openrowset(Bulk '''  @imagepath  ''', Single_Blob) as img),
    @UserEmail,
    @UserPhone,
    @UserAdress)
END
END
  

Комментарии:

1. OPENROWSET требуется литеральная строка. Вам нужно будет использовать динамический SQL и БЕЗОПАСНО (я не могу подчеркнуть это слово достаточно) ввести значение.

2. Я вас не понимаю, не могли бы вы объяснить мне, пожалуйста, решение?

Ответ №1:

Как я уже сказал в комментарии « OPENROWSET требуется литеральная строка. Вам нужно будет использовать динамический SQL и безопасно вводить значение «.:

 DECLARE @imagepath nvarchar(255) = N'C:TempYourImage.png', --Obviously you have set elsewhere.
        @Id int = 1; --Obviously you have set elsewhere.

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13)   NCHAR(10);
SET @SQL = N'INSERT INTO dbo.test(Id, logo)'   @CRLF  
           N'SELECT @Id, BulkColumn'   @CRLF  
           N'FROM OPENROWSET(BULK '''  REPLACE(@imagepath,'''','''''')  ''', SINGLE_BLOB) AS img;';

EXEC sys.sp_executesql @SQL, N'@Id int', @Id; --I have guessed the datatype of @Id
  

Похоже, OP не знаком с тем, как CREATE или ALTER с процедурой; Я должен признать, что нахожу это странным, учитывая, что CREATE в их вопросе есть утверждение, но неважно.

Для создания или изменения процедуры вы используете команду CREATE или ALTER ; в более поздних версиях также есть CREATE OR ALTER .

Проще говоря, это похоже на псевдо SQL:

 CREATE OR ALTER PROC {Your Procedure Name} {Parameters} AS
BEGIN

    {Stored Procedure SQL statements}
END;
  

Итак, вам может понадобиться хранимая процедура, которая возвращает определенный идентификатор клиента; это будет

 CREATE OR ALTER PROC dbo.GetCustomer @ID int AS
BEGIN

    SELECT CustomerName,
           CustomerEmail,
           CustomerPhone
    FROM dbo.Customer
    WHERE ID = @ID;
END;
  

Для того, что у меня есть, просто сделайте это:

 CREATE OR ALTER PROC  dbo.InsertImage @ID int, @imagepath nvarchar(255) AS
BEGIN 
    DECLARE @SQL nvarchar(MAX),
            @CRLF nchar(2) = NCHAR(13)   NCHAR(10);
    SET @SQL = N'INSERT INTO dbo.test(Id, logo)'   @CRLF  
               N'SELECT @Id, BulkColumn'   @CRLF  
               N'FROM OPENROWSET(BULK '''  REPLACE(@imagepath,'''','''''')  ''', SINGLE_BLOB) AS img;';

    EXEC sys.sp_executesql @SQL, N'@Id int', @Id; --I have guessed the datatype of @Id
  

Комментарии:

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

2. Даже если он находится в хранимой процедуре, это не меняет моего ответа, @abdou_dev .

3. Я получил сообщение об ошибке: » Неправильный синтаксис возле ключевого слова «SELECT».

4. Я не могу воспроизвести эту ошибку, @abdou_dev , приведенное выше создает совершенно корректный SQL с теми же входными значениями; что вы изменили?#

5. Я протестировал ваше решение и другое решение, размещенное как tuto в Интернете, но оно не работает для меня mssqltips.com/sqlservertip/4963 / … , это решение сохраняет в базе данных нулевые значения, я не могу понять, что не так с SQL Server 2019?