2016-06-29 27 views
3

だから私は、生成された二重引用符の前に現れるからエスケープ文字を防ぐためにクエリをラップするSQL Serverの2016エスケープ文字の問題

私が使用しているJSON_QUERY「JSONのための」使用してSQL Server 2016からのJSONファイルを( ")を生成しています

注意すべき点は、次のメソッドを使用してSQLのdatetimeオブジェクトを変換していることです。CONVERT(VARCHAR、[dateEntity ]、101)

例(これはサブクエリです)

JSON_QUERY((
SELECT [LegacyContactID] 
     ,[NameType] 
     ,[LastName] 
     ,[FirstName] 
     ,[Active] 
     ,[Primary] 
     ,CONVERT(VARCHAR,[StartDate],101) AS [StartDate] 
     ,CONVERT(VARCHAR,[EndDate],101) AS [EndDate] 
FROM [LTSS].[ConsumerFile_02_ContactName] 
WHERE [LegacyContactID] = ContactList.[LegacyContactID] 
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER 
)) AS ContactName 

そして結果は、私はエスケープを排除するためにJSON_QUERYに包まれた全体のクエリを持っていますが、それはまだ前方には、日付にスラッシュエスケープ

"ContactName": { 
    "LegacyContactID": "123456789", 
    "NameType": "Name", 
    "LastName": "Jack", 
    "FirstName": "Apple", 
    "Active": true, 
    "Primary": true, 
    "StartDate": "04\/01\/2016", 
    "EndDate": "04\/30\/2016" 
} 

になります。

また、変換を行わずに日付を文字列として渡しても、同じ結果が得られます。

洞察?

答えて

0

UPDATED: ああ、はい、エスケープとCLRF文字です。

環境に違反している文字が表示されていない限り、結果セットから手動でコピー&ペーストしてそこから文字列を置き換える必要があります。

ここで、最近更新された内容から、最初にデータを変換する必要がある理由を考える理由がわかりました。 DATESはデフォルトでフォーマットしていないので、JSONSQLの日付を処理するのに互換性がない場合は、JSONの中でこのデータを変換する必要はありません。だから、

データの切り捨ての懸念がまだある場合を除き、ETLの観点から、あなたはこれを実現するには2つの方法があります。

1 - のUSEステージング表

  • ステージング表ができますtemporary tablesCTEs、または実際に空のテーブルextract, cleanse, and transformにデータを使用してください。
  • 利点:挿入されている行のみを扱い、制約に注意する必要はなく、OUTSIDE JSONのデータの破損または非構造化部分を簡単に変更できます。
  • 短所:ステージングテーブルは、データベース内のオブジェクトの必要性がどのくらい反復しているかに応じて、より多くのオブジェクトを表す場合があります。したがって、より良好で一貫した構造化データを見つけることが好ましい。

2 - ここでは、永続的なテーブルに挿入した後、データをクレンジングするビジネスルールを適用

  • STRINGSを使用するようにALTER TABLEを。
  • 利点:スペースを節約し、クレンジングプロセスを簡素化し、引き続きインデックスを使用できます。 SQL ServerはDATE文字列を解析するのにかなり効率的ですが、まだEXISTS()と可能なSARGSを利用して、挿入を実行するときに日付をチェックします。
  • 短所:日付が文字列として保存されている間に、テーブルの一次整合性チェックが失われ、ダーティデータが公開される可能性があります。あなたのUPDATEステートメントは、テーブル全体を使用する必要があります。私はいくつかの同様の問題に遭遇してきた
JSON_QUERY((
SELECT [LegacyContactID] 
     ,[NameType] 
     ,[LastName] 
     ,[FirstName] 
     ,[Active] 
     ,[Primary] 
     ,[StartDate] --it already is in a dateformat 
     ,[EndDate] 
FROM [LTSS].[ConsumerFile_02_ContactName] 
WHERE [LegacyContactID] = ContactList.[LegacyContactID] 
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER 
)) AS ContactName 
+0

何が起こっていることはCONVERT関数が「MM/DD/YYYY」の形式で日付を生成し、その後 'JSON AUTO、WITHOUT_ARRAY_WRAPPERためのものですので、これは動作しません。 'はエスケープシーケンスをスラッシュに追加します。 select文の周りに 'JSON_QUERY'を適用しようとしましたが、日付には役立ちません。 – Chris

+0

@Chris更新を参照してください。 –

0

。細部にまでこだわることなく、これが新しいJSONの機能がまだ私が見ることのできるところから採用のトンを得ていない理由のいくつかであると考えてください。

私はこれとつぶやきに関するMSDNのカップルのコメントを追加しました:

「すべての文字列の自動エスケープがフラグをオフにすることはできませんなぜ???」 - https://msdn.microsoft.com/en-us/library/dn921889.aspx

「ほとんどが、しかしかなりまだ...」 - ?https://msdn.microsoft.com/en-us/library/dn921882.aspx

「他の誰@SQLServer内のすべてのJSONの強制自動エスケープとイライラ/ @AzureSQLDB(私のコメントのリンクを参照してください) msdn.microso ...」 - あなたはこの問題に対処するための方法や方法が出てきた場合https://twitter.com/brian_jorden/status/844621512711831552

、このまたはそれらのスレッドのいずれか、と幸運に聞くのが大好きだ...

+0

合併症は、私からの第三者のデータが必要です。私はエスケープ文字を含むデータを送信しますが、彼らのファイルアップロードは失敗していました。彼らはエスケープ文字にそれを非難しましたが、それが何もしていないことを知るために来たのですが、ファイルの解析は間違っていました。だから私はエスケープ文字を削除することについて心配する必要はありませんでした。 – Chris

+0

[このリンク](https://docs.microsoft.com/en-us/sql/relational-databases/json/solve-common-issues-with-json-in-sql-server#prevent-double-escaped) -json-in-for-json-output)は役に立ちますか? – Fwd079

+0

@ Fwd079実際にはもう少し近づきますが、私はそれが "共通の問題を解決する"セクションですでに特定されているものに対処するためにひどく複雑な方法だと主張します。私が使ってきた超ハックの回避策は、jsonの結果を 'replace(some_json、 '\ /'、 '/')'にラップすることです。以前のコメントがここに移動した後に消えてしまったので、今置き換えられたドキュメントページのコメントを更新しました:https://docs.microsoft.com/en-us/sql/relational-databases/json/how -for-json-escapes-special-characters-and-control-characters-sql-server –

0

一つの解決策は、にあります一般的に日付で「/」を避けるには、the "right" JSON data format

SELECT JSON_QUERY((
    SELECT TOP 1 object_id, create_date 
    FROM sys.tables 
    FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER 
)) 

結果

{"object_id":18099105,"create_date":"2017-08-14T11:19:22.670"}