1

ExcelからSQLBulkCopyを介して入力されるSQLテーブルがあります。コピーダウンは、MicrosoftACEドライバーを使用して行われます。

1つの特定のファイルに問題がありました-それがsqlにロードされたとき、いくつかの列(Excelでは空に見える)に奇妙な値が含まれていました。

たとえば、次のSQLを実行します。

SELECT
    CONVERT(VARBINARY(10),MyCol),
    LEN(MyCol)
FROM MyTab

戻るだろう

0x, 0

つまり、-列の値をに変換するとvarbinary何かが表示されますが、varcharの長さを実行しても長さは表示されません。表示されている値は16進値の語幹であることに気付きましたが、そこに到達するのは奇妙で、検出するのがどれほど難しいかです。

もちろん、Excelでセルをクリアすることもできますが、エンドユーザーにも同じ問題が発生するため、これを自動的に検出する必要があります。データが処理されるときに、さらに問題が発生します。問題を最終的な症状からソースでこの問題にまでさかのぼることは非常に困難です。

上記のSSMSでの出力への変換以外にvarbinary、Excelで、またはSQLスクリプトを使用してこれらの値を削除する方法を思いつきませんでした。

何か案は?

4

2 に答える 2

1

これはあなたを助けるかもしれません:

--16進文字列からvarbinaryへの変換:

DECLARE @hexstring VarChar(MAX);
SET @hexstring = 'abcedf012439';
SELECT  CAST('' AS XML).Value('xs:hexBinary( substring(sql:variable("@hexstring"),     sql:column("t.pos")) )', 'varbinary(max)')
FROM (SELECT CASE SubString(@hexstring, 1, 2) WHEN '0x' THEN 3 ELSE 0 END) AS t(pos)
GO

--varbinaryからhexstringへの変換:

DECLARE @hexbin VarBinary(MAX); 
SET @hexbin = 0xabcedf012439; 
SELECT '0x' + CAST('' AS XML).Value('xs:hexBinary(sql:variable("@hexbin") )', 'varchar(max)'); 
GO

1つの方法は、新しい列を追加し、データを変換し、古い列を削除して、新しい列の名前を古い名前に変更することです。

于 2012-07-19T19:45:10.047 に答える
0

マーティンが上で指摘したように0x、空の文字列を変換すると得られるものです。例えば:

SELECT CONVERT(VARBINARY(10),'')

したがって、それを検出する問題は明らかになくなります。

ACEドライバーまたはSQLBulkCopyのいずれかによる書き込みの過程でフィルターで除去されている、Excelセルにいくつかのゴミがあると想定する必要があります。元々フィールドに何かがあったため、書き込まれた値はnullではなく空になります。

すべてがデータで一貫していることを確認するために、次の多くのスクリプトが機能するように、すべての空の値をnullに切り替える後処理を実行する必要があります。

于 2012-07-20T08:59:10.633 に答える