4

我想将图像插入到图像字段中,最好使用将接受图像路径的存储过程。在四处乱窜后,我想出了这个;

-- functional
DECLARE @parameters nvarchar(max) = '';
DECLARE @sql_string nvarchar(max) = 
N'UPDATE MyTable
  SET MyImageField = (SELECT BulkColumn 
                      FROM Openrowset(Bulk ''' + @PathToMyImage + ''', Single_Blob) ImageData)
  WHERE MyPrimaryKey = ' + CAST(@PrimaryKey AS NVARCHAR(max));

EXECUTE sp_executesql @sql_string,  @parameters

我这样做是因为当我尝试时;

--Not functional
INSERT INTO MyTable (MyImageField) 
VALUES ((SELECT BulkColumn 
         FROM Openrowset(Bulk @PathToMyImage, Single_Blob) ImageData));

SQL Server 抛出一个错误,抱怨 Bulk 需要一个字符串。我宁愿不必为了可维护性/可读性而求助于 sp_executesql,有没有更好的方法来解决这个问题?

4

1 回答 1

7

确实必须使用动态 sql,但您可以使用 quotename() 来避免嵌入式报价噩梦,并且您应该将主键作为实际参数传递。

DECLARE @sql_string nvarchar(max) = 
N'UPDATE MyTable
  SET MyImageField = (SELECT BulkColumn 
                      FROM Openrowset(Bulk ' + quotename(@PathToMyImage,nchar(39)) + ', Single_Blob) ImageData)
  WHERE MyPrimaryKey = @PrimaryKey';

EXECUTE sp_executesql @sql_string, N'@PrimaryKey int',  @PrimaryKey

nchar(39) 是单引号。路径名中的所有单引号都将被正确转义,并且路径将用单引号括起来以进行安全连接。

于 2013-06-06T17:08:53.647 回答