問題描述
今天在做從Excel導入數據到SQL Server 中將數據更新到表中,可惜就這一個簡單的操作中出現了一點小插曲,就在我根據Excel中的編號關聯表編號以此更新姓名字段時出現轉換錯誤問題。如下圖1所示:

圖:1
在SQL Server中,數據類型隱式轉換為從低級別到高級別轉換,FLOAT類型級別高於NVARCHAR,以至於出現圖1錯誤,關於SQL Serevr 詳細數據類型優先級別如下:
從高到底
2.sql_variant
3.xml
4.datetimeoffset
5.datetime2
6.datetime
7.smalldatetime
8.date
9.time
10.float
11.real
12.decimal
13.money
14.smallmoney
15.bigint
16.int
17.smallint
18.tinyint
19.bit
20.ntext
21.text
22.image
23.timestamp
24.uniqueidentifier
25.nvarchar (including nvarchar(max) )
26.nchar
27.varchar (including varchar(max) )
28.char
29.varbinary (including varbinary(max) )
30.binary (lowest)
看到這個問題相信大家都覺得很簡單,直接將字段轉換成字符串類型不就可以了嗎? 好吧,直接CONVERT轉成NVARCHAR類型隨后執行,可以執行成功但是關聯出來沒有數據,很奇怪!由於編號在Excel中的類型為FLOAT,經過轉換后數據變成科學計數法數據,模擬一下數據,如下圖2所示:

圖:2
知道問題緣由后便可以明准的解決問題,可以有一下幾種方法:
1. 在Excel中直接將編號列設置成文本格式,隨后到入到SQL Server做操作。
2.將FLOAT轉換成字符串類型,可先將FLOAT轉成整形或是DECIMAL類型,然后再轉成字符串即可。
3.將關聯另一個表字段轉為FLOAT類型。
關於解決問題第三點,我將另一個表中的字段轉為FLOAT類型出現的如圖1錯誤(從數據類型 nvarchar 轉換為 float 時出錯。) ,經過查看字段的數據全是由數字組成,為何還報轉換錯誤? 由於空格並不會引起該錯誤,然后我將目標轉到換行,回車符上面,果然有的數據最后存在換行符。隨后將換行符(char(10))替換成空即可。
順便附帶一下從Excel導入數據到SQL Server的腳本:
--OPENROWSET SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=C:/Users/Administrator/Desktop/20191008.xlsx', 'select * from [Sheet3$]'); --OpenDataSource SELECT * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source=C:/Users/Administrator/Desktop/20191008.xlsx;Extended Properties="Excel 12.0;HDR=Yes;IMEX=1"')...[Sheet3$];
以上為在工作中遇到的一點小問題,記錄下來以便后續用,也可以為其他遇到這個小坑的朋友提供一點解決的辦法。
