Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách khắc phục “Tên đối tượng‘ OPENJSON ’không hợp lệ.” trong SQL Server

Nếu bạn gặp lỗi Msg 208, Cấp 16 “Tên đối tượng không hợp lệ‘ OPENJSON ’.”, Có thể bạn đang cố sử dụng OPENJSON() hoạt động trên cơ sở dữ liệu có mức độ tương thích nhỏ hơn 130.

OPENJSON() chỉ khả dụng ở mức độ tương thích 130 hoặc cao hơn.

Để khắc phục điều này, hãy tăng mức tương thích của cơ sở dữ liệu của bạn lên 130 hoặc cao hơn hoặc thay đổi sang cơ sở dữ liệu đã có mức tương thích thích hợp.

Ví dụ về Lỗi

Dưới đây là ví dụ về một số mã cơ bản sẽ gây ra lỗi này.

 USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]'); 

Kết quả:

 Msg 208, Level 16, State 1, Line 1Tên đối tượng không hợp lệ 'OPENJSON'. 

Khi mức độ tương thích cơ sở dữ liệu của bạn thấp hơn 130, Máy chủ SQL không thể tìm và chạy OPENJSON() chức năng.

Trong trường hợp của tôi, cơ sở dữ liệu tôi đang cố gắng chạy điều này có mức độ tương thích là 120.

Kiểm tra mức độ tương thích của cơ sở dữ liệu

Bạn có thể truy vấn sys.databases để kiểm tra mức độ tương thích của cơ sở dữ liệu (hoặc tất cả các cơ sở dữ liệu nếu bạn muốn).

 SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets'; 

Kết quả:

 + ----------------------- + | độ tương thích || ----------------------- || 120 | + ----------------------- + 

Như nghi ngờ, cơ sở dữ liệu này có mức độ tương thích nhỏ hơn 130.

Giải pháp 1

Giải pháp rõ ràng nhất là tăng mức độ tương thích của cơ sở dữ liệu mà bạn đang cố gắng chạy OPENJSON() chống lại.

 ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150; 

Chạy mã đó sẽ tăng mức độ tương thích của cơ sở dữ liệu lên 150, mức này quá cao để hỗ trợ OPENJSON() chức năng.

Nếu chúng tôi kiểm tra lại mức độ tương thích, chúng tôi có thể thấy rằng mức đó đã tăng lên 150.

 SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets'; 

Kết quả:

 + ----------------------- + | độ tương thích || ----------------------- || 150 | + ----------------------- + 

Bây giờ chúng tôi có thể chạy mã gốc mà không bị lỗi.

 USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]'); 

Kết quả:

 + ------- + --------- + -------- + | chìa khóa | giá trị | gõ || ------- + --------- + -------- || 0 | Con mèo | 1 || 1 | Con chó | 1 || 2 | Chim | 1 | + ------- + --------- + -------- + 

Giải pháp 2

Nếu vì lý do nào đó mà bạn không thể hoặc không muốn thay đổi mức độ tương thích của cơ sở dữ liệu, bạn có thể chuyển sang cơ sở dữ liệu đã có mức độ tương thích thích hợp.

Rõ ràng, điều này có thể phù hợp hoặc có thể không phù hợp, tùy thuộc vào việc bạn có cần chèn JSON đã phân tích cú pháp của mình vào cơ sở dữ liệu hay không.

Dù sao, để làm điều này, bạn có thể truy vấn sys.databases để có cơ sở dữ liệu phù hợp.

 SELECT 
    name,
    compatibility_level
FROM sys.databases; 

Kết quả:

 + -------------------- + ----------------------- + | tên | độ tương thích || -------------------- + ----------------------- || chính chủ | 150 || tempdb | 150 || mô hình | 150 || msdb | 150 || Âm nhạc | 150 || Kiểm tra | 150 || WideWorldImporters | 130 || Thế giới | 140 || Thú cưng | 120 | + -------------------- + ----------------------- +  

May mắn thay trong trường hợp này, tất cả các cơ sở dữ liệu khác đều là 130 hoặc cao hơn. Vì vậy, chúng tôi có thể chuyển sang bất kỳ một trong số chúng.

 USE World;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]'); 

Kết quả:

 + ------- + --------- + -------- + | chìa khóa | giá trị | gõ || ------- + --------- + -------- || 0 | Con mèo | 1 || 1 | Con chó | 1 || 2 | Chim | 1 | + ------- + --------- + -------- + 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các tính năng bảo mật trong SQL Server 2017

  2. Quyền THỰC HIỆN đã bị từ chối trên đối tượng 'xxxxxxx', cơ sở dữ liệu 'zzzzzzz', giản đồ 'dbo'

  3. Cửa hàng truy vấn SQL Server

  4. Bản ghi ngẫu nhiên từ một bảng cơ sở dữ liệu (T-SQL)

  5. @@ DATEFIRST - Ngày đầu tiên trong tuần trong SQL Server