SQL 服务器批量插入在存储过程中时失败

SQL Server Bulk Insert fails when it is in a stored procedure

我正在尝试将一些 PDF 文件导入临时 table。

我为此创建了一个存储过程并使用了以下代码:

SET @SqlCommand = 'INSERT INTO ZENVIOBOLETO (IDBOLETO,NomeArquivo, image_data) SELECT '+CAST(@IDBOLETO AS VARCHAR(10))+','''+@NomeArquivo+''',image_data FROM OPENROWSET(BULK N'''+@Pasta+@FileName+''''+',SINGLE_BLOB) AS ImageSource(image_data);';

这段代码,如果我使用print @SqlCommand,returns这个输出:

INSERT INTO ZENVIOBOLETO (IDBOLETO,NomeArquivo, image_data) 
    SELECT 803, '20162744', image_data 
    FROM OPENROWSET(BULK N'c:\RM\Boleto.1.803.PDF', SINGLE_BLOB) AS ImageSource(image_data);

但是,当我尝试 运行 我的存储过程时,出现错误:

You do not have permission to use the bulk load statement

但是当我在 SSMS 中使用命令行时,我没有收到任何错误。

存储过程是 运行ning 作为同一个用户,我也试过这个:

ALTER PROCEDURE [dbo].[ACERTANOMEBOLETOS](@Pasta VARCHAR(100), @CODCOLIGADA INT)
WITH EXECUTE AS 'suporte'

我真的不明白发生了什么,在存储过程内部我得到了权限错误,在它之外,我不明白。相同的用户,相同的代码。

此外,该用户是 bulkadmin 的成员并拥有 "ADMINISTER BULK OPERATIONS" 权限。

出于这个原因,我可以 运行 直接在 SSMS 中执行命令。

问题是,为什么我直接进入 SSMS 而不是存储过程?

对我有什么见解吗?

您是否检查了 'trustworthy' 数据库选项?对于来自外部的此类操作,必须将其设置为 'ON'。如果没有,试试这个:

ALTER DATABASE <your_db_name> SET TRUSTWORTHY ON;

所以,有两种方法可以解决:

  1. 如前所述,如果检查了数据库的可信度,它将起作用;
  2. 向 xp_cmdshell 中的用户授予权限并删除 EXECUTE AS

我选择了第二个选项,因为我们将只有 2 个用户使用存储过程。

谢谢!