【发布时间】:2020-12-14 03:12:03
【问题描述】:
我正在尝试将 JPG 图像存储到 MSSQL Server 2014。图像路径被传递到存储过程中,proc 中的部分过程是将图像存储到VARBINARY(MAX) 字段中(我无法更改架构)。我的第一次尝试是在这样的同一个过程中:
DECLARE @pictureSql VARCHAR(300)
SET @pictureSql = 'INSERT INTO PictureBinary
(PictureId, BinaryData)
SELECT ' + CAST(@ImgId AS Varchar) +', * FROM OPENROWSET(BULK ''' +
@ImgPath1 + ''', SINGLE_BLOB) rs'
EXEC(@pictureSql)
尽管来自PRINT() 语句的命令按预期执行,但在存储过程中执行它时遇到了问题。这是一个 VARCHAR 转换错误,几乎导致笔记本电脑上了一堂飞行课,但我正在进行的部分研究建议将此位分解为一个单独的存储过程。在没有真正理解推理逻辑的情况下,我绝望地走上了这条路。同样的问题。
然后我更改了存储过程以接受二进制数据并通过调用应用程序将其传递。我基于this。
(精简版)
ALTER PROCEDURE [dbo].[usp_InsertImage] @ProductId INT,
@imagePath NVARCHAR(300),
@mimeType VARCHAR(40),
@seoFilename NVARCHAR(300),
@altTag NVARCHAR(300),
@titleTag NVARCHAR(300),
@ImgData VARBINARY(MAX)
AS
BEGIN
DECLARE @Id INTEGER
SET @imagePath = REPLACE(@imagePath, '''', '''''')
SET @seoFilename = REPLACE(@seoFilename, '''', '''''')
SET @altTag = REPLACE(@altTag, '''', '''''')
SET @titleTag = REPLACE(@titleTag, '''', '''''')
DECLARE @ImgId INT
INSERT INTO dbo.Picture
(MimeType, SeoFilename, AltAttribute, TitleAttribute, IsNew, VirtualPath)
VALUES (@mimeType, @seoFilename, @altTag, @titleTag, 0, NULL )
SELECT @ImgId = SCOPE_IDENTITY()
INSERT INTO dbo.PictureBinary (PictureId, BinaryData)
VALUES (@ProductId, @ImgData)
INSERT dbo.Product_Picture_Mapping (ProductId, PictureId, DisplayOrder)
VALUES (@ProductId, @ImgId, 1)
SELECT @id;
END
从另一个 SP 调用它是这样的:
DECLARE @childResult INT
EXEC @childResult = dbo.usp_InsertImage
@ProductId = @ProductID,
@imagePath = @ImgPath1,
@mimeType = 'image/jpeg',
@seoFilename = @SeoFilename1,
@altTag = @ProductName,
@titleTag = @ProductName,
@ImgData = @ImgBinary1
也尝试过未命名的参数:
EXEC @childResult = dbo.usp_InsertImage
@ProductID,
@ImgPath1,
N'image/jpeg',
@SeoFilename1,
@ProductName,
@ProductName,
@ImgBinary1
无论我尝试什么,我都会得到同样的错误:
过程或函数 usp_InsertImage 指定了太多参数。
我已经到了一个地步,我什至不确定我是否接近这是正确的方法,这似乎比它应该的更令人恼火。要么那个,要么我是一个完全的木板,错过了一些明显的东西,它有 50/50 的机会。
这只是开发代码,但有人能告诉我这种方法是否正确吗?
【问题讨论】:
标签: sql stored-procedures sql-server-2014