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

SQLServerでエラーメッセージ7325を修正する方法:「CLRタイプの列を公開するオブジェクトは分散クエリでは許可されていません」

    SQL Serverでエラーメッセージ7325が発生した場合は、「CLRタイプの列を公開するオブジェクトは分散クエリでは許可されていません」というエラーメッセージが表示された場合は、CLRタイプの列を1つ以上含むテーブルに対して分散クエリを実行しようとしていることが原因である可能性があります。

    たとえば、地域を使用するテーブルをクエリすることができます。 またはジオメトリ 1つ以上の列のデータ型。これらのデータ型は、SQL Serverで.NET共通言語ランタイム(CLR)データ型として実装されます。また、エラーメッセージにあるように、「CLRタイプの列を公開するオブジェクトは、分散クエリでは許可されていません」。

    幸い、この問題には簡単な修正があります。そして、答えは完全なエラーメッセージとともに提供されます。

    エラーの取得

    エラー7325が発生する分散クエリの例を次に示します。

    SELECT TOP(10) * 
    FROM Homer.WideWorldImportersDW.Dimension.City;
    

    結果:

    Msg 7325, Level 16, State 1, Line 1
    Objects exposing columns with CLR types are not allowed in distributed queries. Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.
    

    この場合、「Homer」と呼ばれるリンクサーバーに対して分散クエリを実行しました。 「WideWorldImportersDW」データベースの「Dimension.City」テーブルをクエリしようとしましたが、機能しませんでした。どうやらテーブルにはCLRタイプが含まれています。

    エラーメッセージは、代わりにパススルークエリを使用することを示唆しています:

    Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.
    

    エラーの修正–パススルークエリ

    これが実際にエラーの「修正」として分類されているのか、単にエラーの「回避」として分類されているのかはわかりません。いずれにせよ、エラーメッセージは、パススルークエリを使用するように指示しているので、それを実行します。

    パススルークエリを使用すると、CLRタイプの列を含むリモートテーブルに対してクエリを実行できます。

    したがって、前のクエリを次のように変更できます。

    SELECT TOP(10) *  
    FROM OPENQUERY(
        Homer, 
        'SELECT * FROM WideWorldImportersDW.Dimension.City'
        );
    

    そのクエリを実行すると、エラーなしで期待どおりの結果が得られます。

    OPENQUERY() 関数を使用すると、指定したリンクサーバーでパススルークエリを実行できます。最初の引数にはリンクされたサーバー名が含まれ、2番目の引数は実行するクエリです(一重引用符で囲みます)。

    したがって、元のクエリをコピーして、2番目の引数として貼り付けることができます。これを行う場合は、リンクされたサーバー名をクエリから削除することを忘れないでください。そうしないと、別のエラーが発生します。私の例では、Homer.WideWorldImportersDW.Dimension.Cityから「Homer」を削除する必要がありました。 、WideWorldImportersDW.Dimension.Cityになりました 。これは、最初の引数でリンクサーバーの名前をすでに指定しているためです。

    犯人を見つける

    前述のように、エラーメッセージは、CLRタイプの列をクエリしようとしていることを示しています。リモート(リンクされた)サーバーにジャンプして次のコードを実行することで、これを確認できます:

    USE WideWorldImportersDW;
    SELECT 
      COLUMN_NAME,
      DATA_TYPE
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'City'
      AND TABLE_SCHEMA = 'Dimension';
    

    結果:

    +----------------------------+-------------+
    | COLUMN_NAME                | DATA_TYPE   |
    |----------------------------+-------------|
    | City Key                   | int         |
    | WWI City ID                | int         |
    | City                       | nvarchar    |
    | State Province             | nvarchar    |
    | Country                    | nvarchar    |
    | Continent                  | nvarchar    |
    | Sales Territory            | nvarchar    |
    | Region                     | nvarchar    |
    | Subregion                  | nvarchar    |
    | Location                   | geography   |
    | Latest Recorded Population | bigint      |
    | Valid From                 | datetime2   |
    | Valid To                   | datetime2   |
    | Lineage Key                | int         |
    +----------------------------+-------------+
    

    場所 がわかります 列のデータ型は地理です 、CLRタイプです。これがエラーの原因である可能性が最も高いです。


    1. MSAccessプロジェクトのすべてのコントロールのコントロールソースを検査します

    2. MariaDBでのMONTH()のしくみ

    3. SQLServer2005のINSERTWHERECOUNT(*)=0でのUNIQUEKEY制約への違反

    4. PL-SQLのcontains()はどのように機能しますか?