从数据库中获取行并将它们插入到另一个行中

本文关键字:插入 另一个 数据库 获取 | 更新日期: 2023-09-27 18:22:22

我有一个表,我使用SqlCommand变量从中读取,对它执行ExecuteReader,在返回的SqlDataReader对象上执行,我正在干预以获取每一行,从那里我对字符串进行操作,以便在插入新数据库中时执行,也使用SqlCommand变量并执行ExecuteNonQuery()

我的问题是是否有更优雅/有效的方法来做到这一点?比如在一个命令中获取所有行并一次插入它们,或者其他任何比当前流更好的行。

更新一件重要的事情是,表位于不同服务器上的不同数据库中。

从数据库中获取行并将它们插入到另一个行中

我建议:一步到位尝试。

INSERT INTO yourDataBase1.yourTable1 VALUES (Column1, Column2, ...)
SELECT Column1, Column2, ... FROM yourDataBase2.yourTable1

好处:

  • 通过以太网的流量更少
  • 与其他解决方案(例如存储过程(相比速度更快

我会在您的 C# 应用程序中执行此基于事务的操作(传输/回滚(。因此,如果出现问题,它不会只插入一半的行。

您可以编写如下所示的存储过程或SqlCommand

INSERT INTO DB1.dbo.TestTable(FirstName, LastName)
SELECT RemoteTable.FirstName, RemoteTable.LastName FROM
OPENROWSET('SQLOLEDB',
           'Server=x.x.x.x;Trusted_Connection=yes;user_id=xxxx;password=xxxx',
           'SELECT FirstName, LastName FROM DB2.dbo.TestTable' ) as RemoteTable

我将发布两个答案的混合 Jay Patel是执行此操作的最佳方法,因为您想使用不同的服务器和数据库。

但是将其包装在尝试捕获和事务中将是最好的主意,因此我将采用Jay Patel的方法并将其包装,因此无论出于何种原因,它都会失败

BEGIN TRAN -- START THE TRANSACTION BUT DONT PHSICALLY PUT THE ROWS IN THE DATABASE UNTIL COMMIT
BEGIN TRY
      INSERT INTO DB1.dbo.TestTable(FirstName, LastName)
    SELECT RemoteTable.FirstName, RemoteTable.LastName FROM
    OPENROWSET('SQLOLEDB',
               'Server=x.x.x.x;Trusted_Connection=yes;user_id=xxxx;password=xxxx',
               'SELECT FirstName, LastName FROM DB2.dbo.TestTable' ) as RemoteTable
END TRY
BEGIN CATCH
ROLLBACK -- IF THE INSERT FAILS DONT INSERT ANYROWS INTO THE DATABASE
END CATCH
COMMIT --USED FOR COMMITING THE ROWS TO THE DATABASE THEY ARE NOT ACTUALLY IN THE DATABASE UNTIL THIS HAS BEEN COMMITED

如果需要 C# .NET 进行操作,那么您有两个选择

1( 使用以下语法构建并插入多行:
值 ((, ((
您可以在单个语句中插入多行 - 这将使它不那么健
谈 最好将每个插入的总值保持在 1000 以下

2( 使用 TVP(表值参数(

您可以在 TSQL 中执行操作,然后只是一个插入。
或者使用 CLR,以便在插入中使用 C#。

通过链接服务器,您可以遍历服务器。
您只需在插入/选择中使用 4 个零件名称。