2011-07-21 121 views
1

我有一個存儲過程,它輸出一列。它運行沒有問題。SQL查詢幫助:從存儲過程插入到臨時表中時出錯

exec dbo.sp_SelectAlignmentSubset 
    @AlnID 
    ,@ParentTaxID 
    ,@SeqTypeID 
    ,@LocationID 
    ,@SubsetSize 
    ,@SimilarityThreshold 
    ,@SimilarityTable 
    ,@AnchorSeqID 

但是當我插入的過程輸出到一個臨時表,

create table #resultSeqIDs 
(
    SeqID int not null 
) 

Insert into #resultSeqIDs 
exec dbo.sp_SelectAlignmentSubset 
    @AlnID 
    ,@ParentTaxID 
    ,@SeqTypeID 
    ,@LocationID 
    ,@SubsetSize 
    ,@SimilarityThreshold 
    ,@SimilarityTable 
    ,@AnchorSeqID 

錯誤提前跳出"The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction."

感謝。

程序的查詢是在這裏:

Alter Proc dbo.sp_SelectAlignmentSubset 
    @AlnID int, 
    @ParentTaxID int, 
    @SeqTypeID int, 
    @LocationID int, 
    @SubsetSize int, 
    @SimilarityThreshold float, 
    @SimilarityTable nvarchar(255), 
    @AnchorSeqID int = null 
As 
    declare @sql nvarchar(4000), @param nvarchar(2000), @subsetActualSize int, @lastSeqID int, @meanSimilarity float 

    --- Cleaning 
    begin try 
     drop table #Subset 
    end try 
    begin catch 
    end catch 
    begin try 
     drop table #tmpAllSeqs 
    end try 
    begin catch 
    end catch 
    begin try 
     drop table #AllSeqs 
    end try 
    begin catch 
    end catch 

    --- Create temp tables 
    create table #Subset 
    (
     SeqID int not null 
    ) 

    create table #AllSeqs 
    (
     SeqID int not null 
    ) 

    create table #tmpAllSeqs 
    (
     SeqID int not null, 
     Similarity float not null 
    ) 

    --- Prepare anchor 
    if @AnchorSeqID is not null 
    begin 
     Insert into #Subset values (@AnchorSeqID) 
     set @lastSeqID = @AnchorSeqID 
    end 

    --- Get all SeqIDs in the alignment under the parent taxID 
    Insert into #AllSeqs 
    Select SeqID 
    from dbo.fn_SelectAlignedSequences(@AlnID, @ParentTaxID, @SeqTypeID, @LocationID) 


    --- Put SeqIDs into #Subset 
    select @subsetActualSize = count(*) from #Subset 

    while @subsetActualSize < @SubsetSize 
    begin 
--  select 'Subset size:'+cast(@subsetActualSize as nvarchar(10)) 
     truncate table #tmpAllSeqs 

     set @sql = 
     ' Insert into #tmpAllSeqs 
      select st.SeqID2 as SeqID 
        ,st.Similarity 
      from ' + @SimilarityTable + ' st 
      where st.SeqID1 = @lastSeqID 
      and  st.SeqID2 in (select SeqID from #AllSeqs) 
      and  st.Similarity <= @SimilarityThreshold 
     ' 
     set @param = '@lastSeqID int, @SimilarityThreshold float' 
     exec sp_executesql @sql, @param, @lastSeqID, @SimilarityThreshold 

     --- Mark the SeqID will be selected from #AllSeqs and 
     --- added to #Subset in this round 
     --- 
     --- Here I select the SeqID with minimum difference from 
     --- mean of similarity as the SeqID 
     select @meanSimilarity = AVG(Similarity) 
     from #tmpAllSeqs 


     select top 1 @lastSeqID = SeqID 
     from #tmpAllSeqs 
     order by abs(Similarity - @meanSimilarity) asc 

     Insert into #Subset values (@lastSeqID) 

     --- Update #AllSeqs (all candidate SeqIDs) 
     truncate table #AllSeqs 

     Insert into #AllSeqs 
     select SeqID 
     from #tmpAllSeqs 

     --- Increment size of #Subset 
     select @subsetActualSize = count(*) from #Subset 

    end 

    select SeqID from #Subset 

    drop table #Subset 
    drop table #AllSeqs 
    drop table #tmpAllSeqs 

Go 
+1

可能重複的[SQL作業有事務日誌...](http://stackoverflow.com/questions/1039391/sql-job-having-issues-with-transaction-log) – JNK

+0

這很有用。我跟着你的鏈接,發現如果我刪除那些「開始嘗試...結束嘗試...開始捕獲...結束捕獲」,那麼它的工作原理。 – Mavershang

+0

更多...(重新:檢查XACT_STATE並寫入日誌)http://www.codeproject.com/KB/database/try_catch.aspx – Chains

回答

0

如果程序運行正常,但插入一條記錄到一個臨時表沒有,那麼我會檢查用戶的角色運行記錄插入。該錯誤消息指出只讀訪問。

2

你在你的存儲過程的結束做以下語句:

select SeqID from #Subset 

drop table #Subset 

嘗試改變,要

Insert Into #resultSeqIDs select SeqID from #Subset 
drop table #Subset 

然後從那裏執行SQL語句的INSERT命令。

由於您的#resultSeqIDs臨時表仍將處於作用域中,它將保存您需要的所有值。

如果您使用的是SQL Server 2008及更高版本,則可以返回一個表變量 - 一個比#temp表更好的替代方法。

相關問題