2014-02-19 4 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

Проблема заключается в том, что временная таблица, созданная в вашей хранимой процедуре, действительна только в пределах объема хранимой процедуры. Как только это будет сделано, таблица temp будет удалена.

Создайте таблицу темпа, как у вас есть (как это работает) через встроенный sql и перейдите на.

1

Похоже, что хранимая процедура не выполнена, а затем временная таблица не создана. Причина заключается в следующем:

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

Ваша хранимая процедура не выполняется, так как выполнить процедуру, вы должны вызвать: EXEC SP_CreateTax.

Примечание: не рекомендуется создавать хранимые процедуры с именем SP, так как имена зарезервированных системных хранимых процедур SQL Server начинаются с SP. По этой причине имена пользовательских хранимых процедур следует отличать от системных, назвав их, например, uSP_CreateTax.

+0

Привет, спасибо за ответ, используя CommandType.StoredProcedure вы должны установить имя SP, а также нет исключения в ExecuteNonQuery(), поэтому sp был выполнен. Также, чтобы получить подтверждение, которое я переименовал из #Tax, чтобы набрать имя таблицы в SP, и таблица была создана на сервере. – FDB

+0

@FDB Mmm..I понимается. Убедитесь, что пользователь SQL Server, который вы используете для подключения, имеет достаточные разрешения. –

Смежные вопросы