ВСТАВИТЬ результат ВЫБОРА в другой запрос [OPENROWSET BULK]

#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 кроме того, я определил переданное значение, а другие люди не могут этого сделать