#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня большая проблема. Я пытался решить в течение 1,5 недели, но ничего. Я пытаюсь использовать OPENROWSET BULK, чтобы получить файл изображения из параметризованного пути и поместить результат в другой запрос. Хранимая процедура выглядит:
ALTER PROCEDURE [dbo].[sp_CreateFoodProduct]
@Name NVARCHAR(255),
@ImagePath NVARCHAR(512),
@Description NVARCHAR(255) = NULL,
@MainImage BIT = 0
AS
DECLARE @Image VARBINARY(MAX);
DECLARE @CommandImage NVARCHAR(1000) = N'SELECT * FROM OPENROWSET(BULK ''' @ImagePath ''', SINGLE_BLOB)Image';
EXEC sp_executesql @CommandImage, N'@Image VARBINARY(MAX) OUTPUT', @Image = @Image OUT;
PRINT @Image; --correct value
SELECT @Image; --NULL (I don't know why)
INSERT INTO FoodProducts (Name) VALUES (@Name)
INSERT INTO FoodImageStore (Image, Description, FoodId, MainImage)
VALUES (@Image, @Description, SCOPE_IDENTITY(), @MainImage)
Теперь @CommandImage возвращает определенное значение (правильное), на следующем шаге я пытаюсь поместить @Image в FoodImageStore, но в столбце Image я вижу NULL. Я не знаю, почему, если
PRINT @Image; --return correct value
Пожалуйста, попытайтесь объяснить мне, почему это так и что мне нужно сделать, чтобы вставить результат ВЫБОРА OPENROWSET BULK в другой запрос.
Комментарии:
1. Предупреждение приведенное выше опасно открыто для инъекционных атак. Никогда не вводите параметры в динамический оператор вслепую. Всегда заключайте их в кавычки или экранируйте символы внутри значения параметра.
2. Например, кто-то может легко передать значение
C:Test.csv', SINGLE_BLOB)Image; CREATE LOGIN SU WITH PASSWORD = '1', CHECK_POLICY = OFF; ALTER SERVER ROLE sysadmin ADD MEMBER SU;--
3. Хорошо, я отменяю. Я должен поместить полученное изображение в базу данных. Итак, какова наилучшая идея для этого?
4. @Larnu кроме того, я определил переданное значение, а другие люди не могут этого сделать