Sql server 从Excel导入,然后插入并相应更新
excel表格中提供了数百行的新数据。我需要插入新行或更新现有行(如果它们已经在目标表中)。数据库中的目标表的列数多于Excel文件 我正在尝试自动化这个过程,但也希望遵循我不熟悉的良好实践,因为我一般不熟悉SQL。另外,我的目标是尽可能多地使用SQL Server(没有可用的SSI),而尽可能少地使用Excel Excel输入:Sql server 从Excel导入,然后插入并相应更新,sql-server,tsql,Sql Server,Tsql,excel表格中提供了数百行的新数据。我需要插入新行或更新现有行(如果它们已经在目标表中)。数据库中的目标表的列数多于Excel文件 我正在尝试自动化这个过程,但也希望遵循我不熟悉的良好实践,因为我一般不熟悉SQL。另外,我的目标是尽可能多地使用SQL Server(没有可用的SSI),而尽可能少地使用Excel Excel输入: Row1Val1 Row1Val2 Row2Val1 Row2Val2 Row3Val1 Row3Val2 Row4Val1 Row4Val2
Row1Val1 Row1Val2
Row2Val1 Row2Val2
Row3Val1 Row3Val2
Row4Val1 Row4Val2
Row5Val1 Row5Val2
我在Excel中使用=CONCATENATE为后面描述的变量表准备值。这是“手动”步骤,但提供的文件可能需要一些调整,所以从我想要创建的KB文章中复制公式并不会增加太多工作
=CONCATENATE("('";A1;"','";B1;"'),")
我决定不使用OPENROWSET,因为我在某个地方读到excel文件不支持它,可能会使数据库崩溃
接下来,我将值加载到变量表和用户游标中,以插入或更新每一行。以下是代码:
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新手,不知道最佳实践。我正在寻找任何意见,将有助于我做得更好。我怀疑这个解决方案是可以接受的,因为SSIS是你的朋友,你说它不可用是什么意思?另外,如果您是SQL Server新手,请倾听其他人对您可能的选项的意见,不要排除您的选项,因为您在internet上的某个地方读过一些内容。它没有安装/设置,或者有其他原因。我确实找到了一些关于使用SSIS的非常好看的教程,但当我问我的团队时,他们对此一无所知。所以我只是在寻找另一个可以接受的解决方案。你有什么理由需要一个光标吗。为什么您不能在val1不在@newvalues中选择val1的情况下执行更新(包括SSI选项),您可以尝试使用内置导入向导功能。您可以这样做:打开SSM,连接到服务器,展开数据库,右键单击将保存导入数据的数据库,展开任务,然后单击导入数据。从那里你就跟着走。我不知道您是否可以自动执行此操作,但通过使用sql server代理作业,这是可能的。希望这些信息是有用的!SSIS是你的朋友,你说它不可用是什么意思?另外,如果您是SQL Server新手,请倾听其他人对您可能的选项的意见,不要排除您的选项,因为您在internet上的某个地方读过一些内容。它没有安装/设置,或者有其他原因。我确实找到了一些关于使用SSIS的非常好看的教程,但当我问我的团队时,他们对此一无所知。所以我只是在寻找另一个可以接受的解决方案。你有什么理由需要一个光标吗。为什么您不能在val1不在@newvalues中选择val1的情况下执行更新(包括SSI选项),您可以尝试使用内置导入向导功能。您可以这样做:打开SSM,连接到服务器,展开数据库,右键单击将保存导入数据的数据库,展开任务,然后单击导入数据。从那里你就跟着走。我不知道您是否可以自动执行此操作,但通过使用sql server代理作业,这是可能的。希望这些信息是有用的!