2012-07-19 15 views
1

我有一個sql表,通過Excel中的SQLBulkCopy填充。複製下來是使用Microsoft ACE驅動程序完成的。檢測來自Excel的varchar列中的值0x

我有一個特定的文件的問題 - 當它加載到SQL,一些列(在Excel中顯示爲空)包含奇數值。

例如,在運行此SQL:

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

將返回

0x, 0 

即 - 在列變換的值以varbinary示出了一些,但這樣做將varchar的長度沒有顯示出長度。我意識到所顯示的值是十六進制值的詞幹,但它的奇怪之處在於它到達那裏,以及要檢測的難度。

很明顯,我可以清除Excel中的單元格,但我真的需要自動檢測此問題,因爲最終用戶會遇到同樣的問題。數據得到處理時,會導致問題進一步惡化。很難將問題從其最終症狀中解救出來,成爲這個問題的源頭。

除上述轉換varbinary在SSMS輸出我還沒有想出的這些檢測值的方法,無論是在Excel或通過SQL腳本將其刪除。

任何想法?

+1

這只是一個空字符串是不是? 'SELECT CONVERT(VARBINARY(10),'')' – 2012-07-19 18:11:18

+0

啊對。所以問題變成了爲什麼ACE插入這個而不是像通常爲空單元一樣。我不希望一個大的後期過程將它們轉換爲空值。 – 2012-07-19 19:15:58

回答

0

正如Martin在上面指出的,0x是您在轉換空字符串時得到的結果。例如:

SELECT CONVERT(VARBINARY(10),'') 

所以檢測它的問題明顯消失。

我不得不假設在excel單元中存在一些垃圾,即在ACE驅動程序或SQLBulkCopy的寫入過程中被過濾掉。因爲本來在這個領域有些東西,所寫的值是空的而不是空的。

爲了確保數據中的所有內容都一致,我們需要執行後續過程以將所有空值切換爲空值,以便下一批腳本可以工作。

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轉換爲十六進制字符串:

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

一種方法是增加一個新列,轉換數據,刪除 舊列,並將新列重命名爲舊名稱。

+0

感謝您的時間,但我認爲十六進制是一個紅鯡魚 - 沒有實現0x =空。 – 2012-07-20 09:00:08