0

我有这个代码

USE [DATABASE]
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 @Box,@Code,@Validity

WHILE @@FETCH_STATUS = 0
begin

Insert into Cards (Box, BarCode, ValidityDate) 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$]')
fetch next from c into @Box,@Code,@Validity

end

CLOSE c
DEALLOCATE c


end

在导出到表“卡片”时,空行也被复制到表中并且进程不会停止,循环继续进行并且进程一遍又一遍地重新启动,查询不会停止执行,除非我停止它,当我看到表格的内容时,我看到空行的 NULL 值和填充行的值,并且它们是重复的,那么如何阻止查询读取空行并阻止它读取 excel 文件和结束?

4

3 回答 3

1

试试这个为你的循环:

WHILE @@FETCH_STATUS = 0
begin

Insert into Cards (Box, BarCode, ValidityDate)
    select @Box, @Code , @Validity;

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

end;

您的原始代码使用游标和直接在from语句中获取。这个版本只使用光标。

于 2013-05-18T23:11:24.697 回答
0

为什么不只使用这样的东西而不是游标

INSERT INTO (Box, BarCode, ValidityDate) 
SELECT *
  FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Barcodes.xlsx;HDR=YES', 
           'SELECT Box, Code, Validity FROM [sheet1$]')
于 2013-05-18T22:50:43.680 回答
-2

我使用 Task--> Import data 选项将数据从 excel 传输到 sql,并且得到了无限循环。我关闭了 SQL Server 管理工作室并重试了相同的选项,它对我有用。

于 2015-05-17T16:11:56.467 回答