Issue:
After running an Sql command with SqlCommand() on a database that then inserts data into another database, all following statements error with ExceptionInvalid object name.
Question:
Why is this happening?
Additional Information:
I know how to fix it by adding The Temp database name before the table on the select portion but since it is being run in the context of that database that shouldn’t be necessary and is not when I run the statements individually in SQL management studio
Program Logic:
- Create and fill temp database (All tables ASI_…)
- In context of temp database select data and then insert it into another database (@AcuDB)
- Repeat Step 2 for X queries
Insertion code:
if (TempD.State == System.Data.ConnectionState.Closed) TempD.Open();
Command = new SqlCommand(temp, TempD);
Command.CommandTimeout = 0;
Command.ExecuteNonQuery();
Sample Sql being run that errors after previous similar statement:
insert into @AcuDB..Batch (CompanyID,BranchID,
Module,BatchNbr,CreditTotal,DebitTotal,ControlTotal,CuryCreditTotal,CuryDebitTotal,CuryControlTotal,CuryInfoID,LedgerID,BatchType,Status,AutoReverse,AutoReverseCopy,OrigModule,OrigBatchNbr,DateEntered,Released,Posted,LineCntr,CuryID,ScheduleID,NoteID,CreatedByID,CreatedByScreenID,CreatedDateTime,LastModifiedByID,LastModifiedByScreenID,LastModifiedDateTime,Hold,Description,Scheduled,Voided,FinPeriodID,TranPeriodID)
select 2,
1,Module,BatchNbr,CreditTotal,DebitTotal,ControlTotal,CuryCreditTotal,CuryDebitTotal,CuryControlTotal,i.CuryInfoID,
isnull((select a.LedgerID from @AcuDB..ledger a where a.LedgerCD =
b.LedgerID),0)
[LedgerID],BatchType,Status,AutoReverse,AutoReverseCopy,OrigModule,OrigBatchNbr,
DateEntered
[DateEntered],Released,Posted,LineCntr,b.CuryID,ScheduleID,NoteID,
‘B5344897-037E-4D58-B5C3-1BDFD0F47BF9’ [CreatedByID], ‘00000000’
[CreatedByScreenID], GETDATE() [CreatedDateTime],
‘B5344897-037E-4D58-B5C3-1BDFD0F47BF9’ [LastModifiedByID], ‘00000000’
[LastModifiedByScreenID], GETDATE()
[LastModifiedDateTime],Hold,Description,Scheduled,Voided,b.FinPeriodID,TranPeriodID
from Temp..ASI_GLBatch b inner join @AcuDB..CurrencyInfo i on
i.CuryEffDate = b.DateEntered cross join @AcuDB..glsetup g where
b.companyID = @CpnyCD and b.branchID = @BranchCD
Going across databases like this is always precarious due to the way SQL will try to imply contexts. In this case, unless
@AcuDBcontains the fully-qualified address that includes both the database and the schema, you’re going to get errors because of the way you’re switching contexts around. Get a reading on what@AcuDBcontains and try to run the batch in a stored procedure. Set up a separate instance to sandbox the scenario if you have to. The C# end of this is going to continue to complicate things until you cut it out for a little bit and make sure your SQL is good. After you’re sure it’s okay, integrate it back into the C# code and work from there.