【问题标题】:Bulk Insert problem批量插入问题
【发布时间】:2011-11-15 22:07:46
【问题描述】:

我有一个从某个文件批量插入的存储过程:

CREATE PROCEDURE [dbo].[SP_BulkInsert] @FileName NVARCHAR(200) AS
BEGIN
DECLARE @bulkinsert NVARCHAR(1000)

SET @bulkinsert = N'BULK INSERT TblTemp FROM ''' + @FileName + 
       N''' WITH (FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')'

EXEC sp_executesql @bulkinsert

RETURN @@ROWCOUNT
END

当我从 SQL Server Management Studio 运行此存储过程时,它运行良好,但是当我尝试使用 ADO.NET 的 ExecuteNonQuery 运行它时,我收到以下错误:

“对象'TblTemp',数据库的INSERT权限被拒绝 'TempDB',架构 'dbo'。”

重要提示:所有其他存储过程(使SELECT/INSERT/DELETE/UPDATE)在 ADO.NET 中运行良好。

运行所有事物的用户是bulkadmin 角色的成员,也是自定义db_executer 角色的成员(该角色只有EXECUTE 权限)。

很多存储过程的代码运行良好,这是第一次失败.. 这是函数

public static int BulkInsert(string fileName)
{
    SqlParameter paramFileName = new SqlParameter("FileName", fileName);
    SqlParameter paramRetValue = new SqlParameter();
    paramRetValue.Direction = ParameterDirection.ReturnValue;
    SqlParameter[] @parameters = { paramFileName, paramRetValue };
    SqlHelper.ExecuteNonQuery(ConnectionSettings.ConnectionString,
    CommandType.StoredProcedure, "SP_BulkInsert", parameters, true);

    return (int)paramRetValue.Value;
}

我使用与 ADO.NET 端的连接字符串中相同的用户名/密码登录 SSMS..

最根本的问题是,为什么在 Management Studio 中存储过程成功,而通过 ADO.NET 却失败了(出现上述错误消息)。

【问题讨论】:

  • 你能告诉我们你正在使用的 ADO.NET 代码吗?
  • @marc_s。马克,谢谢你的编辑。代码在很多存储过程中运行良好。 ExecuteNonQuery(ConnectionSettings.ConnectionString, CommandType.StoredProcedure, "SP_SomeBulkInsert", parameters, true);
  • 谢谢 - 但您能否将其放入您的原始问题中 - 而不是在 cmets 中很难阅读。另外:重要和有趣的事情是连接字符串,如何设置连接等 - 不仅仅是那一行!
  • 您确定要将其放入 TempDB 吗?也许你想把它放到另一个数据库中......在你做批量插入之前尝试使用Use [insert_ur_Databasename_here]
  • @Mulki No.. 存储过程中有一个 'use TempDB' 子句。只有带有这些表和存储过程的数据库..

标签: sql-server sql-server-2005 sql-server-2008 bulkinsert


【解决方案1】:

Management Studio 必须在具有所有权限的 sa 帐户上运行,但您通过 ADO.NET 连接的用户可能没有设置正确的权限。您需要通过 Management Studio 授予用户写入权限。查看用户列表。

【讨论】:

  • 我使用与 ADO.NET 端的连接字符串中相同的用户名/密码登录 SSMS。我在问题中添加了这一点,谢谢。。
【解决方案2】:

通过 sp_executesql 运行 SQL 使用的权限与直接在存储过程中使用的权限不同。我建议检查您正在运行存储过程的用户是否具有(在这种情况下)对表“TblTemp”的 INSERT 权限。

在 Sql Server Management Studio 中执行此操作...

  • 展开表格列表
  • 右键单击相应的并选择属性
  • 在“权限”选项卡上,单击“添加...”按钮。
  • 输入用户或角色,或者“浏览...”。
  • 在顶部表格中选择用户或角色后,在“{username/role} 的显式权限”的相应权限中勾选“授予”
  • 点击确定

【讨论】:

  • 我运行相同的存储过程 'SP_BulkInsert'.. 在 Management Studio 中成功,通过 ADO.NET 失败.. 为什么?
  • 您是否使用与通过 ADO 运行存储过程的用户名/密码相同的用户名/密码登录 SSMS?根据我的经验,即使用户对表没有直接的 SELECT/INSERT/UPDATE/DELETE 权限,其中包含普通 TSQL 语句的存储过程也会正确运行。但是,如果该 TSQL 语句是通过动态 sp_executesql 命令运行的,我认为它使用的不是同一个用户,因此对表没有正确的权限。
  • 我使用与 ADO.NET 端的连接字符串中相同的用户名/密码登录 SSMS。那么 SQL 服务器在什么用户下运行动态查询?我怎么知道它的权限?
  • 不幸的是,我没有知识来回答这个问题......但我建议尝试直接在有问题的表上为连接字符串用户名设置权限,因为这一直都是为我工作
猜你喜欢
  • 2011-01-19
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2020-11-27
相关资源
最近更新 更多