SQL Server批量插入在存储过程中失败

时间:2016-12-18 10:33:38

标签: sql-server bulkinsert

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

我为此创建了一个存储过程,我使用了这段代码:

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,此代码将返回此输出:

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);

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

  

您无权使用批量加载声明

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

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

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

我真的没有得到正在发生的事情,在存储过程中我得到了权限错误,在它之外,我没有得到。相同的用户,相同的代码。

此外,该用户是bulkadmin的成员,并具有“ADMINISTER BULK OPERATIONS”权限。

因此我可以直接在SSMS中运行命令。

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

对我有什么见解?

2 个答案:

答案 0 :(得分:0)

您是否检查过“值得信赖的”'数据库选项?它必须设置为“开启”。从外面进行此类操作。如果不是,试试这个:

ALTER DATABASE <your_db_name> SET TRUSTWORTHY ON;

答案 1 :(得分:0)

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

  1. 如上所述,如果检查数据库是否为TRUSTWORTHY,它将起作用;
  2. 授予xp_cmdshell中的用户权限并删除EXECUTE AS
  3. 我做了第二个选项,因为我们只有2个用户使用存储过程。

    谢谢!