我需要将大量数据移动到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
答案 0 :(得分:3)
问题是存储过程中创建的临时表仅在该存储过程的范围内有效。一旦完成,临时表就会被删除。
通过内联sql以你的方式(它的工作方式)创建临时表并继续。
答案 1 :(得分:1)
似乎您的存储过程未执行,因此未创建临时表。 原因是:
SqlCommand oSqlCommand = new SqlCommand("SP_CreateTax", oSqlConnection);
您的存储过程未执行,因为要执行某个过程,您必须调用:EXEC SP_CreateTax
。
注意:不建议创建以SP
命名的存储过程,因为SQL Server的保留系统存储过程的名称以SP
开头。因此,必须将自定义存储过程的名称与系统名称区分开来,并将它们命名为uSP_CreateTax
。