【问题标题】:SQL Server 2016: Import of JSON InformationSQL Server 2016:JSON 信息的导入
【发布时间】: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&uuml;r den unternehmungslustigen Gast. Genie&szlig;en Sie tags&uuml;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&ouml;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&ouml;glichkeiten, Restaurants, Bars und Caf&eacute;s entfernt (regelm&auml;&szlig;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&uuml;cher gegen Kaution). Pool-/Snackbar, Strandbar. Elegante Empfangshalle, Rezeption, WLAN in der Lobby, Sitzgruppen, Lobbybar, Spieleraum, Fernsehecke mit Gro&szlig;bildschirm, klimatisiertes Hauptrestaurant, 4 &Agrave;-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&ouml;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&ouml;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&ouml;hn. Balkon. Meerseite/seitl. Meerblick. Max. 4E\n<br /> \n<br /> \n<strong>Essen und Trinken:</strong> all inclusive: Fr&uuml;hst&uuml;cksbuffet, mittags und abends kaltes/warmes Buffet, Themenabende, t&auml;glich Showkochen\n<br /> Snacks (stdw.), nachm. Kaffee, Tee, Geb&auml;ck\n<br /> Alkoholfr., nat. alkohol. (ab 18 J.) Getr&auml;nke von 10:00-24:00 Uhr (an der Strandbar von 10:00-17:00 Uhr)T&auml;gliche Auff&uuml;llung der Minibar mit Wasser\n<br /> \n<br /> \n<strong>Wellness und Fitness:</strong> Wellnesscenter (ca. 370 qm)\n<br /> T&uuml;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 (&ouml;rtlicher Anbieter, gegen Geb&uuml;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 &amp; 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


【解决方案1】:

在 SQL Server 2016 CU7 中,仍然需要 JSON 文件必须编码为 Little Endian (UCS-2) 或带有 BOM 的 UTF8。没有 BOM 的 UTF8 会遇到该错误。

【讨论】:

  • 除非您告诉服务器,否则服务器无法知道您使用的 Unicode 编码类型。毕竟,如果您只使用英文字符,UTF8 文件与 ANSI 文件没有什么不同。尝试使用CODEPAGE = '65001',这是 UTF8 的代码页
猜你喜欢
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2018-03-15
  • 2017-12-11
相关资源
最近更新 更多