3

DB1 と DB2 という 2 つのデータベースがあります。
DB1 には、DB2 のデータにもアクセスするすべてのストアド プロシージャが含まれています。
DB1 はシノニムを使用して DB2 のテーブルにアクセスします。
(私たちの状況では同義語を使用することが必須です)

これは、SQL Server 2005 Developer Edition のすべての状況で問題なく機能します。

ただし、Express Edition では、次の操作を行うと例外が発生します。
1 SQL Server を再起動します。
2 DB1 内で次のコードを実行します。

set transaction isolation level snapshot
begin transaction
declare @sQuery varchar(max)
set @sQuery = 'Select * from synToSomeTableInDB2'
exec (@sQuery)
commit transaction

これにより、次のエラーが発生します。

現在のトランザクションが開始されたときにデータベースが回復されなかったため、データベース '...' でスナップショット分離トランザクションが失敗しました。データベースが復旧してから、トランザクションを再試行してください。

同じ選択クエリは、EXEC なしで使用した場合、または Developer Edition で実行した場合に問題なく通過します。
ステップ 1 でサーバーを再起動することは重要です。DB2 への接続が確立されると、SQL Server Express Edition でもコードが正常に実行されるためです。

誰でもこれが何であるか分かりますか? 一部の動的クエリには EXEC を使用できる必要があります。既に MSDN をチェックし、Google を検索しました...どんな助けも大歓迎です。

--- 編集: 2009 年 3 月 10 日
以下で Ed Harper と話し合ったように、私はこれについてバグ レポートを提出しました。https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=422150
を参照してください。

4

2 に答える 2

3

Microsoft Connectで判明したように、問題は SQL Server Express Edition のデフォルトでAUTO_CLOSEオプションがtrueに設定されていることです。
このオプションをfalseに変更すると、問題が修正されます。

于 2009-03-30T08:18:48.027 に答える
1

このエラー メッセージは、クエリを実行したときにサービスを再起動した後、SQL サーバーがまだデータベースを回復しているため、クエリが失敗したことを示しています。

サービスが再起動されてからの経過時間に関係なく、このコードを最初に実行しようとすると常にエラーが発生しますか?

再起動後、データベースが正常に回復していることを SQL Server ログから確認できますか?

于 2009-03-05T11:07:58.657 に答える