检测来自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。
为了确保数据中的一切都是一致的,我们需要做一个后处理来将所有空值切换到空值,以便下一批脚本可以工作。