#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?