批量插入问题

时间:2011-09-13 07:15:12

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

我有一个存储过程,可以从某个文件中进行批量插入:

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运行它时,此存储过程运行正常,但是当我尝试使用ExecuteNonQuery ADO.NET运行它时,我收到以下错误:

  

“对象'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失败(带有上述错误消息)。

2 个答案:

答案 0 :(得分:1)

通过sp_executesql运行SQL使用的权限与直接在存储过程中不同。我建议检查您正在运行存储过程的用户(在此实例中)对表“TblTemp”的INSERT权限。

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

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

答案 1 :(得分:0)

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