1

我有一个通过 Excel 中的 SQLBulkCopy 填充的 sql 表。使用 Microsoft ACE 驱动程序完成复制。

我遇到了一个特定文件的问题 - 当它被加载到 sql 时,一些列(在 excel 中显示为空)包含一个奇数值。

例如,运行这个 sql:

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

会回来

0x, 0

即 - 将列中的值转换为varbinary显示某些内容,但执行 varchar 的长度显示没有长度。我意识到显示的值是十六进制值的词干,但它到达那里很奇怪,而且检测起来有多难。

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

除了上述转换为varbinarySSMS 中的输出之外,我还没有想出一种方法来检测这些值,无论是在 Excel 中还是通过 SQL 脚本来删除它们。

有任何想法吗?

4

2 回答 2

1

这可能会帮助您:

-- 从十六进制字符串转换为 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 转换为 hex 字符串:

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

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

于 2012-07-19T19:45:10.047 回答
0

正如马丁在上面指出的,0x当你转换一个空字符串时你会得到什么。例如:

SELECT CONVERT(VARBINARY(10),'')

因此,检测它的问题显然消失了。

我必须假设 excel 单元格中有一些垃圾,在 ACE 驱动程序或 SQLBulkCopy 的写下过程中被过滤掉了。因为原来字段中有东西,所以写入的值是空的,而不是null。

为了确保数据中的所有内容都是一致的,我们需要进行后期处理以将所有空值切换为空值,以便接下来的大量脚本可以工作。

于 2012-07-20T08:59:10.633 回答