【问题标题】:SQL Server Bulk Insert fails when it is in a stored procedureSQL Server 大容量插入在存储过程中时失败
【发布时间】:2017-05-03 14:42:26
【问题描述】:

我正在尝试将一些 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 而不是存储过程?

对我有什么见解吗?

【问题讨论】:

标签: sql-server bulkinsert


【解决方案1】:

您是否检查了“可信赖”数据库选项?对于从外部进行的此类操作,必须将其设置为“ON”。如果没有,试试这个:

ALTER DATABASE <your_db_name> SET TRUSTWORTHY ON;

【讨论】:

    【解决方案2】:

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

    1. 如前所述,如果数据库经过 TRUSTWORTHY 检查,它将正常工作;
    2. 在 xp_cmdshell 中授予用户权限并删除 EXECUTE AS

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

    谢谢!

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      相关资源
      最近更新 更多