2010-10-18 22 views
1

我有一個數據表匹配MS Sql表的結構,我想從數據表導入新的記錄到SQL中。從數據表導入到SQL表的唯一記錄

因此,在下面的示例中,我正在尋找導入Jim的記錄。

數據表:

Name DOB  Country 
Brian 11-11-78 USA 
Dave 01-01-80 UK 
Jim 02-02-81 FR 

SQL:

Name DOB  Country 
Brian 11-11-78 USA 
Dave 01-01-80 UK 
+0

表中的主鍵是什麼?您可以將所有記錄從原始數據庫導入臨時表,然後執行MERGE(SQL Server) – Tony 2010-10-18 09:45:20

+0

對不起,我沒有PK。我計劃結合使用Name和DOB的組合來區分。 – Brian 2010-10-18 09:54:38

+0

另請參閱Microsoft Sync Framework(http://msdn.microsoft.com/zh-cn/sync/default.aspx) – 2010-10-18 09:54:43

回答

1

您可以使SP,並傳遞您在數據表中有值,並且使用MERGE (Transact-SQL)做INSERT /更新:

根據你的數據修剪,假設你的名字SQL表_DOB

MERGE INTO _DOB AS Target 

USING (--SELECT NAME,DOB,COUNTRY FROM FROM YOUR DataTable 
     VALUES ('Jim','1978-11-11', 'FR') 
     ) 
     AS Source (Name, DOB, Country) 
ON 
    Target.Name = Source.Name 
    AND Target.DOB = Source.DOB 

WHEN MATCHED THEN 
    UPDATE SET 
     Target.Name = Source.Name, 
     Target.DOB = Source.DOB, 
     Target.Country = Source.Country 

WHEN NOT MATCHED BY TARGET THEN 
    INSERT (Name, DOB, Country) 
    VALUES (Source.Name, Source.DOB, Source.Country); 
+0

不需要存儲過程,只需批量將數據複製到臨時表中,然後使用MERGE語句(如上所示)更新目標。這應該比分別合併每一行更有效。 – Tony 2010-10-18 10:22:36

+0

根據數據大小和操作頻率,可能是一個選項。 – 2010-10-18 10:36:36

+0

謝謝Kman。託尼,我會在代碼中創建臨時表嗎? – Brian 2010-10-18 15:14:19

0
INSERT INTO 
    datatable (name, dob, country) 
SELECT 
    name, dob, country 
FROM 
    sql 
WHERE 
    NOT EXISTS(
     SELECT 
      * 
     FROM 
      datatable 
     WHERE 
      datatable.name=sql.name AND 
      datatable.dob=sql.dob 
    ) 
1

這是我結束了,似乎這樣的伎倆。感謝所有的投入。

this.conn = new oleDbConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString); 

OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM name", conn); 

DataSet ds = new DataSet(); 

adapter.Fill(ds, "name"); 

DataTable data = ds.Tables["name"]; 

sqlCommand = "CREATE TABLE ##TempTable(Name, DOB, Location)"; 

SqlConnection SQLconn = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection1"].ConnectionString); 
SQLconn.Open(); 

using (SqlCommand cmd = new SqlCommand(sqlCommand, SQLconn)) 
{ 
    cmd.CommandType = CommandType.Text; 

    cmd.ExecuteReader(); 

    SqlBulkCopy bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString); 
    // Map the columns 
    foreach (DataColumn col in data.Columns) 
    bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); 
    bulkCopy.DestinationTableName = "##TempTable"; 
    bulkCopy.WriteToServer(data); 
} 

string MergeCommand = string.Concat("insert into [Existing Table] (Name, DOB, Location) ", 
    "select distinct Name, DOB, Location from ##TempTable ", 
    "WHERE NOT EXISTS (SELECT 1 FROM [Existing Table] a WHERE a.[Name] = ##TempTable.[Name] and a.[DOB] = ##TempTable.[DOB])"); 

SqlConnection Mergeconn = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString); 
Mergeconn.Open(); 

using (SqlCommand MergeCmd = new SqlCommand(MergeCommand, Mergeconn)) 
{ 
    MergeCmd.CommandType = CommandType.Text; 
    MergeCmd.ExecuteReader(); 
} 

SQLconn.Close(); 
Mergeconn.Close();