Sql server 从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

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

我正在尝试自动化这个过程,但也希望遵循我不熟悉的良好实践,因为我一般不熟悉SQL。另外,我的目标是尽可能多地使用SQL Server(没有可用的SSI),而尽可能少地使用Excel

Excel输入:

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代理作业,这是可能的。希望这些信息是有用的!