如何在OPENROWSET(BULK ...)中动态指定文件的路径?

Ada*_*dam 4 t-sql sql-server bulkinsert

我想将图像插入到Image字段中,最好使用一个存储过程来接受图像的路径.在黑客入侵后我想出了这个;

-- 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
Run Code Online (Sandbox Code Playgroud)

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

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

SQL Server抛出一个错误,抱怨Bulk期望一个字符串.我宁愿不必使用sp_executesql来实现可维护性/可读性,还有更好的方法吗?

JC *_*ord 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
Run Code Online (Sandbox Code Playgroud)

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