【发布时间】: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