sql >> データベース >  >> RDS >> Sqlserver

メモリ内ではなく、メモリ内のユーザー定義テーブル?

    これも見えます。

    RCSIが有効になっている場合、メモリ内のテーブルタイプの2つのインスタンスを結合すると、デフォルトの読み取りコミットレベルでの自動コミットトランザクションが正常に機能します。

    DECLARE @t1 [dbo].[tType]
    DECLARE @t2 [dbo].[tType]
    
    INSERT INTO @t1 VALUES (1);
    
    INSERT INTO @t2 VALUES (1);
    
    SELECT *
    FROM   @t1
           JOIN @t2
             ON [@t1].C = [@t2].C 
    

    また、2つの異なる「通常の」メモリ最適化テーブルを結合すると、ヒントがなくても正常に機能します。

    さらに、空のメモリ最適化テーブルタイプを通常のメモリ最適化テーブルに結合することは正常に機能します。

    DECLARE @t [dbo].[tType];
    
    SELECT *
    FROM   [dbo].[tTable] t
            INNER JOIN @t
                ON [@t].C = t.C 
    

    しかし、その逆は真実ではありません。メモリ内のテーブルタイプのインスタンスに少なくとも1つの行が含まれている限り、それをメモリ内のテーブル(空またはその他)に結合するとエラーが発生します。

    解決策は簡単で、エラーメッセージに示されています。テーブルヒントWITH (SNAPSHOT)を追加するだけです

    DECLARE @t [dbo].[tType]
    
    INSERT INTO @t
    VALUES     (1)
    
    SELECT *
    FROM   [dbo].[tTable] t WITH(SNAPSHOT)
           INNER JOIN @t
             ON [@t].C = t.C
    

    または、より詳細でないソリューションは

    ALTER DATABASE [MemOptimized] 
    SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON WITH ROLLBACK IMMEDIATE 
    

    私が収集できる限り、これらのどちらも実際にはセマンティクスを変更せず、状況によってはヒントを省略できるのはプログラミングの便宜にすぎません。

    このメモリテーブルタイプの違いがこの特定のエラーメッセージを引き起こす理由がわかりません。これはCTPであるという単なるアーティファクトであり、RTMでは組み合わせが許可されるか、ディスクベースのテーブルだけでなくエラーメッセージとドキュメントが更新されると思います。



    1. ubuntuARMHFでmySQLトリガーWHITOUTsys_execを使用して外部スクリプトを呼び出す

    2. Oracleの日付の減算-数値または間隔のデータ型?

    3. SQL Serverで無効になっているすべての外部キー制約を返す方法(T-SQLの例)

    4. SQLServer2019でファイルをコピーする新しい方法