Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara Memperbaiki Error Msg 7325 di SQL Server:"Objek yang mengekspos kolom dengan tipe CLR tidak diizinkan dalam kueri terdistribusi"

Jika Anda menemukan pesan kesalahan 7325 di SQL Server "Objek yang mengekspos kolom dengan tipe CLR tidak diizinkan dalam kueri terdistribusi" itu mungkin karena Anda mencoba menjalankan kueri terdistribusi terhadap tabel yang berisi satu atau lebih kolom dengan tipe CLR.

Misalnya, Anda dapat membuat kueri tabel yang menggunakan geografi atau geometri tipe data dalam satu atau lebih kolomnya. Tipe data ini diimplementasikan sebagai tipe data .NET common language runtime (CLR) di SQL Server. Dan seperti yang dikatakan oleh pesan kesalahan, “Objek yang mengekspos kolom dengan tipe CLR tidak diizinkan dalam kueri terdistribusi”.

Untungnya, ada perbaikan mudah untuk masalah ini. Dan jawabannya diberikan dengan pesan kesalahan lengkap.

Mendapatkan Kesalahan

Berikut adalah contoh kueri terdistribusi yang menghasilkan kesalahan 7325.

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

Hasil:

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"'.

Dalam hal ini saya menjalankan kueri terdistribusi terhadap server tertaut yang disebut "Homer". Saya mencoba menanyakan tabel "Dimension.City" pada database "WideWorldImportersDW", tetapi tidak berhasil. Rupanya tabel tersebut berisi tipe CLR.

Pesan kesalahan menyarankan agar saya menggunakan kueri pass-through sebagai gantinya:

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

Memperbaiki Error – Pass-Through Query

Saya tidak yakin apakah ini benar-benar diklasifikasikan sebagai "memperbaiki" kesalahan atau hanya sebagai "mengatasi" kesalahan. Either way, pesan kesalahan memberitahu saya untuk menggunakan kueri pass-through jadi itulah yang akan saya lakukan.

Menggunakan kueri pass-through memungkinkan kita menjalankan kueri terhadap tabel jarak jauh yang berisi kolom dengan tipe CLR.

Jadi kita bisa mengubah query sebelumnya menjadi berikut:

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

Ketika saya menjalankan kueri itu, saya mendapatkan hasil yang diharapkan tanpa kesalahan.

OPENQUERY() fungsi memungkinkan kita untuk menjalankan kueri pass-through pada server tertaut yang ditentukan. Argumen pertama berisi nama server yang ditautkan, dan argumen kedua adalah kueri yang ingin kita jalankan (diapit oleh tanda kutip tunggal).

Jadi Anda dapat menyalin kueri asli dan menempelkannya sebagai argumen kedua. Jika Anda melakukan ini, jangan lupa untuk menghapus nama server tertaut dari kueri, jika tidak, Anda akan mendapatkan kesalahan lain. Dalam contoh saya, saya harus menghapus "Homer" dari Homer.WideWorldImportersDW.Dimension.City , sehingga menjadi WideWorldImportersDW.Dimension.City . Ini karena kami sudah menyediakan nama server tertaut di argumen pertama.

Menemukan Pelakunya

Seperti yang disebutkan, pesan kesalahan memberi tahu saya bahwa saya mencoba menanyakan kolom dengan tipe CLR. Saya dapat memverifikasi ini dengan melompat ke server jarak jauh (tertaut) dan menjalankan kode berikut:

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

Hasil:

+----------------------------+-------------+
| 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         |
+----------------------------+-------------+

Kita dapat melihat bahwa Location kolom memiliki tipe data geografi , yang merupakan tipe CLR. Ini adalah penyebab kesalahan yang paling mungkin.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa cara terbaik untuk menyimpan koordinat (bujur/lintang, dari Google Maps) di SQL Server?

  2. Memantau Database dan Instance melalui Activity Monitor | Pemecahan Masalah Kinerja SQL Server -2

  3. Bagaimana saya bisa keluar dari tanda kurung siku dalam klausa LIKE?

  4. CAST dan IsNumeric

  5. Bagaimana cara menemukan level transaksi saat ini?