我在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此代码看起来很容易改变,但任何评论都表示赞赏。这个任务必须每月执行一次,所以我想主要为实践自动化。