データフィールド内の区切り文字は、区切られたファイルの一般的な問題です。これに対処するためのいくつかの一般的な戦術は次のとおりです。
- ファイルに書き込まれる前に、データフィールドからすべての区切り文字が削除された状態でデータファイルを再作成します。これにより、OPENROWSETエラーが排除されますが、データの整合性は維持されません。
- 別の区切り文字を使用してデータファイルを再作成します。私の経験では、タブ区切り文字の方が適しています。データ内でコンマよりもタブ文字に遭遇することはあまり一般的ではありません。しかし、それは確かに前代未聞ではありません。データ内のタブも見ました。
- データフィールドを二重引用符で囲みます。これには、XML形式ファイルを微調整する必要があります。
データファイルを手動で編集することは、上記のオプションのいずれでも実行できる可能性があります。ただし、特に大きなファイルの場合は、面倒な場合があります。(Notepad.exeで数GBのファイルを開くだけでも、忍耐力が必要です。)現実的には、作成者にファイルを再作成してもらいたいと思います。オプション#1は常に「機能」する必要があります。しかし、繰り返しになりますが、あなたが生きることができないかもしれないデータの完全性の問題があります。オプション#2はおそらく多くの場合に機能しますが、防弾ではありません。オプション#3も防弾ではありませんが(データフィールド内に区切り文字を含めることは常に可能です)、可能な限り近いものです。さらに、データの整合性を維持します。
XML形式ファイルの可能性の1つは次のとおりです。
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR='","' MAX_LENGTH="5"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR='","' MAX_LENGTH="128" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR='"\r\n' MAX_LENGTH="128" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Reference" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="2" NAME="Name" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="3" NAME="Street" xsi:type="SQLVARYCHAR"/>
</ROW>
</BCPFORMAT>
フィールドターミネーターに注意してください。一重引用符を使用","
して、ターミネーターおよび"\r\n
行ターミネーター(COLUMN 3ターミネーター)として識別しました。私はそれを知識に基づいて推測しName
、Street
最大128文字です。必要に応じて編集してください。
問題:
- OPENROWSET()クエリは
Reference
、先頭に"
二重引用符を付けて返されます。そしてそのために...
Reference
INT(またはSMALLINT、BIGINTなど)として返すことはできません。VARCHAR(xsi:type="SQLVARYCHAR"
)として返されます
Reference
提供されている特定のデータサンプルについては、データフィールドから二重引用符を削除し、XML形式ファイルをであるように調整し、さらにXML形式ファイルをであるように調整FIELD ID="1"
します。TERMINATOR=',"'
COLUMN SOURCE="1"
xsi:type="SQLINT"
いくつかの追加情報については、このブログ投稿が役立つ場合があります:OPENROWSETおよびBULK行セットプロバイダー入門-パート2