【发布时间】:2018-01-11 08:56:45
【问题描述】:
我使用 SQL Server 2016 来存储我通过 REST/JSON 接收到的不同信息。这很好用,我实际上添加了其他来源(4 种导入类型)。在一个 json 导入中,我遇到了这样的错误:
消息 13609,第 16 级,状态 4,第 2 行
JSON 文本的格式不正确。在位置 0,发现了意外的字符“൛”。
我检查了文件和语法,它们与我导入的其他文件/格式相似(没有错误):
Json 示例:
[
{
"cid": 6498,
"hotel_description": "Hotelmerkmale: All Inclusive, Family, Paare, Single\n<br /> \n<br /> Die ideale Wahl für den unternehmungslustigen Gast. Genießen Sie tagsüber vom Pool den entspannenden Blick auf das Meer und die Side-Halbinsel und leben Sie abends Ihr Shopping- oder Tanzfieber in der nahe gelegenen Altstadt von Side aus.\n<br /> \n<br /> \n<strong>Lage:</strong> In erhöhter Lage mit Panoramablick auf das Meer und die historische Altstadt von Side. Ca. 200 m vom kilometerlangen, flach abfallenden, feinen Sandstrand und ca. 1,5 km vom Zentrum mit zahlreichen Einkaufs- und Unterhaltungsmöglichkeiten, Restaurants, Bars und Cafés entfernt (regelmäßige Minibusverbindungen vorhanden).\n<br /> \n<br /> \n<strong>Ausstattung:</strong> Bekanntes Hotel der gehobenen Mittelklasse mit 2 Swimmingpools (einer davon mit 2 Wasserrutschen), Sonnenterrasse. Liegen, Auflagen, Sonnenschirme (Badetücher gegen Kaution). Pool-/Snackbar, Strandbar. Elegante Empfangshalle, Rezeption, WLAN in der Lobby, Sitzgruppen, Lobbybar, Spieleraum, Fernsehecke mit Großbildschirm, klimatisiertes Hauptrestaurant, 4 À-la-carte-Restaurants, Minimarkt, Diskothek, Friseur, Hallenbad. Landeskategorie: 5 Sterne, 341 Zimmer, 6 Etagen, Lifte.\n<br /> \n<br /> \n<strong>Wohnen:</strong> Doppelzimmer (ca. 18-22 qm), Klimaanlage (indiv.), Minibar, Telefon, TV, Mietsafe, Kaffee-/Teeset. Dusche/WC mit Föhn. Balkon. Max. 2E. Wahlweise seitl. Meerblick/Meerblick. Max. 3E, auch zur Alleinnutzung buchbar\n<br /> Juniorsuite (ca. 35 qm), zus. Couch, Klimaanlage (indiv.), Minibar, Telefon, TV, Mietsafe, Kaffee-/Teeset. Dusche/WC mit Föhn. Balkon. Landseite/seitl. Meerblick. Max. 3E+1K\n<br /> Familienzimmer (ca. 40 qm), zus. separates Schlafzimmer, Klimaanlage (indiv.), Minibar, Telefon, TV, Mietsafe, Kaffee-/Teeset. Dusche/WC mit Föhn. Balkon. Meerseite/seitl. Meerblick. Max. 4E\n<br /> \n<br /> \n<strong>Essen und Trinken:</strong> all inclusive: Frühstücksbuffet, mittags und abends kaltes/warmes Buffet, Themenabende, täglich Showkochen\n<br /> Snacks (stdw.), nachm. Kaffee, Tee, Gebäck\n<br /> Alkoholfr., nat. alkohol. (ab 18 J.) Getränke von 10:00-24:00 Uhr (an der Strandbar von 10:00-17:00 Uhr)Tägliche Auffüllung der Minibar mit Wasser\n<br /> \n<br /> \n<strong>Wellness und Fitness:</strong> Wellnesscenter (ca. 370 qm)\n<br /> Türkisches Bad, Dampfbad, Sauna\n<br /> Jacuzzi, Wellnessmassagen (geg. Geb.)\n<br /> Fitnessraum (ca. 70 qm)\n<br /> \n<br /> \n<strong>Sport und Fitness:</strong> Tischtennis\n<br /> Wassersport am Strand (örtlicher Anbieter, gegen Gebühr)\n<br /> \n<br /> \n<strong>Einzelzimmer ohne Aufpreis:</strong> Zu bestimmten Terminen kein Zuschlag\n<br /> \n<strong>Single mit Kind:</strong> Kinderfestpreis bei einem Vollzahler\n<br /> \n<strong>Kinderfestpreis:</strong>2 Kinder 2-12 Jahre\n<br />\n<br /> \n<br /> \n<strong>Minis & Maxis (4-12 Jahre):</strong> Miniclub (stdw.)\n<br /> Spielplatz, Kinderbuffet\n<br /> \n<br />"
}
]
我的 SQL 语句如下所示:
MERGE dbo.hotel_description t
USING ((SELECT
cid, hotel_description
FROM
OPENROWSET(BULK 'C:\Import\weg.de\hotel_info_import.json', SINGLE_NCLOB)j
CROSS APPLY
OPENJSON(BulkColumn)
WITH
(cid INT,
hotel_description NVARCHAR(MAX)))) s ON t.cid = s.cid
WHEN NOT MATCHED THEN
INSERT (cid, hotel_description)
VALUES (s.cid, s.hotel_description);
我检查了 Google 和 stackoverflow,但没有发现该错误消息的原因。 有什么提示吗?
谢谢
问候 蒂莫
【问题讨论】:
-
这表示 input 有一个奇怪的起始字符。我猜你试图读取一个以 BOM 开头的文件
-
尝试将数据直接导入临时表并检查第一个字符是什么。 BOM 为 U+FEFF。
-
嗨 Panagiotis,发现了问题(仅供参考:SQL Server 2016 在 CU7 上)。你的一个猜测是一个很好的提示。我将 json 文件的编码从 UTF8 更改为 UCS2,它可以工作。我认为这个错误自 CU1 以来已修复。谢谢
标签: json sql-server sql-server-2016