2014-02-19 41 views
3

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

这是代码工作完美:

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 

回答

1

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

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

1

看来你的存储过程没有执行,然后你的临时表没有被创建。 原因是这样的:

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

不执行你的存储过程,因为执行过程中,你必须调用:EXEC SP_CreateTax

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

+0

嗨感谢您的回答,使用CommandType.StoredProcedure您必须设置SP的名称,并且ExecuteNonQuery()也没有例外,因此sp已执行。此外,为了确认我已从#Tax重命名为SP中的表名,并在服务器上创建了表。 – FDB

+0

@FDB嗯..我明白了。请确保您用于连接的SQL Server用户具有足够的权限。 –