關于Excel導入到sql操作的相關問題總結:
一、大批量數據導入
方法1、從Excel大批量數據導入時我們可以使用sql里面有一個batch copy的功能
方法2、在sql中建一個table type結構,在前端將excel讀到datatable中,把整個datatable作為存儲過程參數傳到后臺數據庫。
舉例:
c#:
public void Import(DataTable dt){SqlParameter[] parms = new SqlParameter[] { new SqlParameter("@DataTable",SqlDbType.Structured)};parms[0].Value = dt;SQLHelper.ExecuteNonQueryStoredProcedure(ConnString, "ImportExcel", parms);}
?
SQL:
--創建table type
CREATE TYPE [dbo].[DataTable_TYPE] AS TABLE(
[NO] [varchar](20) NULL,[Dept] [varchar](20) NULL,[EmployeeNO] [decimal](18,2) NULL,[EmployeeName] [nvarchar](50) NULL,[JoinDate] [datetime] NULL,[TotalScore] [decimal](18, 2) NULL,[JobQty] [int] NULL,[JobI] [decimal](18, 2) NULL,[JobJ] [decimal](18, 2) NULL,[JobK] [decimal](18, 2) NULL,[JobL] [decimal](18, 2) NULL,[JobM] [decimal](18, 2) NULL,[JobN] [decimal](18, 2) NULL,[JobO] [decimal](18, 2) NULL
)
--導入數據存儲過程
create proc ImportExcel
@DataTable DataTable_TYPE readonly
as
begin
insert into XXtable
select ......
from @DataTable
end
?注意:在導入excel數據時,很多時候將excel讀到datatable的時候,excel里的數值列會變成科學計數法,這時請將對應的表或table type的列的類型設為decimal即可。
也有說在數據庫select的時候直接用cast(cast(abc as float) as decimal(xxx,xx)), 但這好像會有一個問題就是四舍五入的問題,比如 10056390 科學計數法為?1.00564e+007 轉換后會變成 10056400
?