Distributed transaction error over linked server query

  • I have couple of servers with SQL Server 2000 on windows 2003 SP1.

    Simulate scenario

    -- Run on SQLSERVER2

    BEGIN DISTRIBUTED TRANSACTION

    select * from SQLSERVER1.pubs.dbo.sysobjects

    COMMIT

    When I am using above linked server query to fetch data from one server and insert data to local server following SQL error is returned.

    [OLE/DB provider returned message: New transaction cannot enlist in the specified transaction coordinator. ]

    OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a].

    Msg 7391, Level 16, State 1, Line 2

    The operation could not be performed because the OLE DB provider 'SQLOLEDB' was unable to begin a distributed transaction.

    Microsoft refrence article

    http://support.microsoft.com/kb/839279/en-us

    Please note

    1) MSDTC is configured to allow Network DTC Access

    2) There is no firewall between the servers

  • Gopal ,

    Have you rebooted the servers? MSDTC should be enabled on both servers.

    You may want to give this a try. If this does not work, let me know, there is a work-around, without using Distributed Transactions, but this will depend on the requirements.

    Regards,

    Wameng Vang

    MCTS

  • MSDTC was configured long time back and servers are rebooted couple of time after the configuration.

    Please post the work around.

  • Gopal,

    Note: After re-evaluating your posting, I am assuming that your original code was something like this.

    Possible Problem:[/u]

    INSERT DestDB.dbo.Table

    select from SourceServer.SourceDB.dbo.Table

    --NOTE:** Something like this will require Distributed Transactions to be fully functional.

    Sample Work-around Code using Temp table as a temporary placeholder[/u]

    if (exists (select 1 from tempdb.dbo.sysobjects where name like '%Mengus%'))

    begin

    drop table #Mengus

    end

    -- Grab data from Linked Server/Database (Source)

    select

    *

    INTO #Mengus

    from LinkedServerSource.master.dbo.sysobjects

    -- Transactions when applicable....

    -- Then INSERT DATA FROM Temp Table into Local Database

    --......

    --......

    -- Handle Transaction (Rollback/Commit) when applicable

    Regards,

    Wameng Vang

    MCTS

  • Actually the original code looks like as follows

    INSERT INTO DestTable

    EXEC SourceServer.database.dbo.usp_returnOneRecordSet

    I don't have choice of editing code of source server.

  • Gopal,

    *** Check this old forum post:http://qa.sqlservercentral.com/Forums/Topic200830-8-1.aspx

    Regarding your comments:

    If that's the case, temporary tables will not work. I have tried it for a couple cases. However if you rewrite the logic and convert the stored procedure to an actual SELECT statement, you can use temporary tables and "SELECT INTO."

    Example:

    Instead of

    INSERT INTO #temp

    EXEC SourceServer.database.dbo.uspSproc

    Must be converted to:

    select

    --Appropriate Columns (as returned by stored procedure)

    INTO #temp

    from SourceServer.database.dbo.Table

    Regards,

    Wameng Vang

    MCTS

  • Thanks. I am aware of this kind of approach but I don't have option to modify code on source server.

    BTW Does anybody know of real cause of this problem.

Viewing 7 posts - 1 through 6 (of 6 total)

You must be logged in to reply to this topic. Login to reply