2013-07-15 112 views
0

我有一张表,我用它读取变量SqlCommand,在其上执行ExecuteReader一个返回的SqlDataReader对象我正在计算每一行,我从哪里开始操作字符串在插入新DB时使用变量SqlCommand并执行ExecuteNonQuery()从数据库获取行并将它们插入另一个

我的问题是,如果有更优雅/高效的方式来做到这一点?就像在一个命令中获取所有行一样,一次插入所有行或者其他任何比当前流程更好的行。

UPDATE 一个重要的事情是这些表位于不同服务器上的不同数据库中。

+0

完全取决于您的需求。听起来你可能会在一个大的SQL语句('Insert Something select Foo from SomethingElse')中做到这一点,在这种情况下,如果你在一个proc中编写它,并且只是称为proc,它会更快地执行。但是,对于数据的处理方式,你会失去一点控制权。还取决于你正在使用多少记录,你实际需要它运行多快,等等。 –

+0

@JoeEnos正如我在更新中所述,表或在不同的服务器上,所以我不能只做一个大的'SqlCommand'因为它们与不同的连接相关联。 – coredump

+0

如果您右键单击SSMS中的数据库并选择“任务 - >导入”,则可以选择SQL服务器/数据库源和目标。 c#是一种手段和结束还是要求? – James

回答

1

你可以写它看起来像

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 
0

存储过程或SqlCommand如果操作是你需要C#.NET的,那么你有两个选择

1)建立和插入多个行使用的语法:
values(),()
您可以在单个语句中插入多于一行 - 这将使它不那么健谈
最好保持总值上课小于1000为每个插入

2)使用TVP(表值参数)

在可以执行在TSQL操纵然后只是的插入件。
或者使用CLR,以便在插入中使用C#。

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

2

我会建议:一步试一试。

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

优点:以太网

  • 较少的流量
  • 快速与其它方案相比(如存储过程)

我会做这个交易为基础的在C#应用程序(传输/回滚)。所以如果出现问题,它不会只插入一半的行。

0

我打算发布两个答案的组合Jay Patel是这样做的最好方法,因为您希望使用不同的服务器和数据库。

但是将它包装在try catch和transaction中将是最好的想法,所以我会采用Jay Patel的Method并包装它,所以无论出于何种原因它都会出现故障。

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 
相关问题