从Excel导入然后相应地INSERT和UPDATE

时间:2017-10-04 13:23:22

标签: sql-server tsql

我在excel表中提供了新数据(几百行)。如果它们已经在目标表中,我需要插入新行或更新现有行。数据库中的目标表具有比Excel文件更多的列。

我正在尝试自动化该过程,但也希望遵循良好的做法(我不熟悉,因为我一般都是SQL的新手)。另外我的目标是尽可能多地使用SQL Server(没有SSIS可用)和Excel。

Excel输入:

Row1Val1  Row1Val2  
Row2Val1  Row2Val2  
Row3Val1  Row3Val2  
Row4Val1  Row4Val2  
Row5Val1  Row5Val2  

我在Excel中使用= CONCATENATE为变量表准备VALUES(稍后描述)。它是手册'步骤,但提供的文件可能需要一些调整,所以从KB文章(我想创建)复制公式并没有增加太多的工作。

=CONCATENATE("('";A1;"','";B1;"'),")

我决定反对OPENROWSET,因为我读到某个地方,对于excel文件,它不受支持(?)并且可能会使数据库崩溃。

接下来,我将值加载到变量表和用户游标中,每行加入INSERT或UPDATE。这是代码:

DECLARE @NEW_VALUES TABLE(
 VAL1 nvarchar(18) not null,
 VAL3 nvarchar(max) not null
 )
DECLARE @new_value1(18),
 @new_value2 nvarchar(50),
 @new_value3 nvarchar(max),
 @new_value4 nchar(1)

--Default values:
SET @new_value2 = NULL 
SET @new_value4 = 0

INSERT INTO @NEW_VALUES 
VALUES -- Copy values from excel file, remove comma from last line!

DECLARE new_values CURSOR
 FOR SELECT VAL1, VAL3 FROM @NEW_VALUES
 OPEN new_values
 FETCH NEXT FROM new_values INTO @new_value1, @new_value3
 WHILE @@FETCH_STATUS = 0 
 BEGIN 
  IF EXISTS (SELECT 1 FROM TABLE_WITH_VALUES WHERE VAL1 = @new_value1)
   UPDATE TABLE_WITH_VALUES
    SET VAL1 = @value1,
     VAL2 = @value2,
     VAL3 = @value3,
     VAL4 = @value4
    WHERE VAL1 = @new_value1
   ELSE
    INSERT INTO TABLE_WITH_VALUES
     (VAL1,
     VAL2,
     VAL3,
     VAL4)
    VALUES
     (@new_value1
     ,@new_value2
     ,@new_value3
     ,@new_value4)
  FETCH NEXT FROM new_values INTO @new_value1, @new_value3
 END
 CLOSE new_values;
DEALLOCATE new_values;

它工作正常,但(我之前提到过)我是SQL的新手,我不了解最佳实践。我正在寻找任何可以帮助我做得更好的评论。我怀疑这个解决方案对于<1000行是可以接受的,但是我将来可能需要不同的方法来增加行数。

也可能需要导入3列而不是2列。 IMO此代码看起来很容易改变,但任何评论都表示赞赏。这个任务必须每月执行一次,所以我想主要为实践自动化。

0 个答案:

没有答案