Skrypt SQL, tryb zgodności bazy, JSON

0

Witajcie.
Silnik bazodanowy MS SQL Server 2017 wersja Developerska
Przykładowy skrypt:

DECLARE @json NVARCHAR(MAX);
SET @json = N'[
  {"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25},
  {"id": 5, "info": {"name": "Jane", "surname": "Smith"}, "dob": "2005-11-04T12:00:00"}
]';

SELECT *
FROM OPENJSON(@json)
  WITH (
    id INT 'strict $.id',
    firstName NVARCHAR(50) '$.info.name',
    lastName NVARCHAR(50) '$.info.surname',
    age INT,
    dateOfBirth DATETIME2 '$.dob'
  );

wykonuje się poprawnie w Management Studio.

Jak dodam na początku skryptu

USE [TEST]
GO

czyli skrypt wygląda tak

USE [TEST]
GO

DECLARE @json NVARCHAR(MAX);
SET @json = N'[
  {"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25},
  {"id": 5, "info": {"name": "Jane", "surname": "Smith"}, "dob": "2005-11-04T12:00:00"}
]';

SELECT *
FROM OPENJSON(@json)
  WITH (
    id INT 'strict $.id',
    firstName NVARCHAR(50) '$.info.name',
    lastName NVARCHAR(50) '$.info.surname',
    age INT,
    dateOfBirth DATETIME2 '$.dob'
  );

to Management Studio wywala błąd
Incorrect syntax near 'strict $.id'.

Jak podniosę tryb zgodności bazy TEST do SQL Server 2017 to Management Studio nie wywala błędu

Jak to ogarnąć bez podnoszenia trybu zgodności żeby skrypt działał poprawnie w Management Studio ?

Z góry dziękuję za pomoc.

1

SQL server
Czytając doc. mogę powiedzieć, że gdy masz ustawioną dobrą konfigurację bazy, to najpierw piszesz
USE nazwa_bazy;
GO
bez nawiasów kwadratowych.

Wszystko przed GO jest potraktowane jako CMD, zwykły batchowy tekst do wykonania. Po zeskanowaniu GO przechodzi do trybu składni bazy danych, wychodzi z wiersza poleceń.

4

Poświeciłem kawałek mojego bezwartościowego życia i sytuacja wygląda tak. Za dokumentacją: https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql?view=sql-server-ver15 aby funkcja OPENJSON działała poprawnie baza musi mieć ustawiony "compatibility level" na przynajmniej 130.
Żeby sprawdzić, jaki masz ten poziom dla poszczególnych baz to możesz użyć takiego zapytania:

 SELECT * FROM sys.databases

Aby zmienić ten poziome mozesz zrobić tak:

 ALTER DATABASE TEST SET COMPATIBILITY_LEVEL = 130

I wtedy powinno zadziałać.

0

Dziękuję za odpowiedzi.
Rzeczywiście lepiej nie podnosić Compatibility level bo coś na pewno się wyłoży.
Muszę zastosować rozwiązanie z zdefiniowaniem tabeli jako typu danych i przez niego ładować dane do zapytania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1