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;
所以,有两种方法可以解决:
- 如前所述,如果检查了数据库的可信度,它将起作用;
- 向 xp_cmdshell 中的用户授予权限并删除 EXECUTE AS
我选择了第二个选项,因为我们将只有 2 个用户使用存储过程。
谢谢!
我正在尝试将一些 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;
所以,有两种方法可以解决:
- 如前所述,如果检查了数据库的可信度,它将起作用;
- 向 xp_cmdshell 中的用户授予权限并删除 EXECUTE AS
我选择了第二个选项,因为我们将只有 2 个用户使用存储过程。
谢谢!