检测来自Excel的varchar列中的值0x

我有一个SQL表格,从Excel中通过SQLBulkCopy填充。 副本是使用Microsoft ACE驱动程序完成的。

我有一个特定的文件的问题 – 当它被加载到SQL,一些列(在Excel中显示为空)包含一个奇怪的值。

例如,运行这个sql:

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

会返回

 0x, 0 

即 – 将列中的值转换为varbinary显示的东西,但做长度的varchar显示没有长度。 我意识到,所显示的值是hex值的词干,但其奇怪的是它到达那里,以及检测有多困难。

很明显,我可以清除Excel中的单元格,但是我真的需要自动检测,因为最终用户会遇到同样的问题。 当数据得到处理时,会导致问题进一步恶化。 这个问题很难从最终的症状中追溯到源头上的这个问题。

除了上面的转换到varbinary到SSMS输出,我还没有想出一种方法来检测这些值,在Excel中或通过SQL脚本来删除它们。

有任何想法吗?

这可以帮助你:

– 从hexstring到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 

一种方法是添加新列,转换数据,删除旧列并将新列重命名为旧名称。

正如Martin在上面指出的那样, 0x是当你转换一个空string时得到的。 例如:

 SELECT CONVERT(VARBINARY(10),'') 

所以检测它的问题显然会消失。

我必须假设在excel单元中有一些垃圾,在ACE驱动程序或SQLBulkCopy的写入过程中被过滤掉。 因为本来在这个领域有东西,所写的值是空的而不是null。

为了确保数据中的一切都是一致的,我们需要做一个后处理来将所有空值切换到空值,以便下一批脚本可以工作。