使用Cursor在SQL Server中插入表

我想导入一个Excel文件到SQL,该文件有3列:框 – 代码 – 有效性我正在使用以下查询

USE [Libatel] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[GetDataExcel] as DECLARE c CURSOR FOR select Box, Code , Validity FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Barcodes.xlsx;HDR=YES', 'SELECT Box, Code , Validity FROM [sheet1$]') declare @Code as bigint declare @Box as bigint declare @Validity as date begin open c fetch next from c into @Code,@Box,@Validity WHILE @@FETCH_STATUS = 0 begin select @Box = Box,@Code = BarCode,@Validity =ValidityDate from Cards Insert into Cards (BarCode,Box,ValidityDate) values (@Box,@Code,@Validity) fetch next from c into @Box,@Code,@Validity end CLOSE c DEALLOCATE c end 

我正在接受

 11155232026 1 2013-05-18 1 11155232026 2013-05-18 ... ... 

这是第一行总是和框和代码正在改变每一行的地方,我做错了什么?

您的第二次fetch具有错误的列顺序:

 fetch next from c into @Code,@Box,@Validity ... fetch next from c into @Box,@Code,@Validity 

另一个问题是这个说法:

 select @Box = Box,@Code = BarCode,@Validity =ValidityDate from Cards 

这有效地从Cards表中取出一个随机行,放弃游标中的值。 也许你可以澄清这条线应该做什么?

 declare @Holder table ( ColumnA varchar(24) , ColumnB varchar(32) , ColumnEtcEtc varchar(64)) Insert into @Holder (ColumnA, ColumnB, ColumnEtcEtc ) select Box, Code , Validity FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Barcodes.xlsx;HDR=YES', 'SELECT Box, Code , Validity FROM [sheet1$]') Delete From @Holder where DATALENGTH(LTRIM(RTRIM(ColumnB))) <=0 

要么

 Insert into @Holder (ColumnA, ColumnB, ColumnEtcEtc ) select Box, Code , Validity FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Barcodes.xlsx;HDR=YES', 'SELECT Box, Code , Validity FROM [sheet1$] where ColumnA = 2 ') 

我不是在excel查询where子句的专家,但我猜测有一个方法。