SqlBulkCopy到SqlServer 2008中的临时表

时间:2014-02-19 13:54:31

标签: c# sql-server-2008 sqlbulkcopy

我需要将大量数据移动到sql server 2008数据库。我从源服务器获取数据并使用SqlBulkCopy写入目标服务器。必须从存储过程中解析此数据,然后将其删除。我想创建一个临时数据但是,如果我使用SqlCommand在客户端上创建临时数据,SqlBulkCopy可以访问该表并且工作正常,如果我在服务器上使用存储过程执行相同的脚本,则SqlBulkCopy.WriteToServer返回InvalidOperationException“无法访问目标表'#Tax'”

这是完美的代码:

SqlDataReader oSqlDataReader -> read form server source
SqlConnection oSqlConnection = new SqlConnection(_ConnectionTarget)
SqlCommand oSqlCommand = new SqlCommand("Create Table #Tax (Id int)", oSqlConnection);
oSqlCommand.CommandType = CommandType.Text;
oSqlCommand.CommandTimeout = 0;
oSqlCommand.ExecuteNonQuery();
SqlBulkCopy oSqlBulkCopy = new SqlBulkCopy(oSqlConnection)
oSqlBulkCopy.DestinationTableName = "#Tax";
oSqlBulkCopy.WriteToServer(oSqlDataReader);

这是抛出InvalidOperationException异常的代码:

SqlDataReader oSqlDataReader -> read form server a
SqlConnection oSqlConnection = new SqlConnection(_ConnectionTarget)
SqlCommand oSqlCommand = new SqlCommand("SP_CreateTax", oSqlConnection);
oSqlCommand.CommandType = CommandType.StoredProcedure;
oSqlCommand.CommandTimeout = 0;
oSqlCommand.ExecuteNonQuery();
SqlBulkCopy oSqlBulkCopy = new SqlBulkCopy(oSqlConnection)
oSqlBulkCopy.DestinationTableName = "#Tax";
oSqlBulkCopy.WriteToServer(oSqlDataReader);

SP_CreateTax:

Create Procedure SP_CreateTax 
AS
Begin
    Create Table #Tax (Id int)    
End

2 个答案:

答案 0 :(得分:3)

问题是存储过程中创建的临时表仅在该存储过程的范围内有效。一旦完成,临时表就会被删除。

通过内联sql以你的方式(它的工作方式)创建临时表并继续。

答案 1 :(得分:1)

似乎您的存储过程未执行,因此未创建临时表。 原因是:

SqlCommand oSqlCommand = new SqlCommand("SP_CreateTax", oSqlConnection);

您的存储过程未执行,因为要执行某个过程,您必须调用:EXEC SP_CreateTax

注意:不建议创建以SP命名的存储过程,因为SQL Server的保留系统存储过程的名称以SP开头。因此,必须将自定义存储过程的名称与系统名称区分开来,并将它们命名为uSP_CreateTax