臨時表:Test
/****** 對象: Table [dbo].[Test] 腳本日期: 05/10/2013 11:42:07 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Test]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserID] [int] NOT NULL, [UserName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL, CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]
臨時表的觸發器:tri_edit
CREATE TRIGGER [tri_edit] ON [dbo].[Test] instead of insert as
declare @temp int
select @temp= inserted.UserID from inserted
--更新已經存在的主鍵(更新全部字段)
if(@temp IS Not NULL )
update [Test] set UserQQ=inserted.UserQQ
from [Test] join inserted on [Test].UserID=inserted.UserID
else --(更新指定的部分字段)
update [Test] set UserName=inserted.UserName
from [Test] join inserted on [Test].UserID=inserted.UserID
--插入存在的主鍵數據
insert [Test] (UserID,UserName)
select inserted.UserID,inserted.UserName
from inserted left join [Test] on inserted.UserID=[Test].UserID
where [Test].id is null
go
C# SqlBulkCopy方法:
/// <summary> /// SqlBulkCopy往數據庫中批量插入數據 /// </summary> /// <param name="sourceDataTable">數據源表</param> /// <param name="targetTableName">服務器上目標表</param> /// <param name="mapping">創建新的列映射,並使用列序號引用源列和目標列的列名稱。</param> public static void BulkToDB(DataTable sourceDataTable, string targetTableName, SqlBulkCopyColumnMapping[] mapping) { /* 調用方法 - 2013年05月10日編寫 //DataTable dt = Get_All_RoomState_ByHID(); //SqlBulkCopyColumnMapping[] mapping = new SqlBulkCopyColumnMapping[4]; //mapping[0] = new SqlBulkCopyColumnMapping("Xing_H_ID", "Xing_H_ID"); //mapping[1] = new SqlBulkCopyColumnMapping("H_Name", "H_Name"); //mapping[2] = new SqlBulkCopyColumnMapping("H_sName", "H_sName"); //mapping[3] = new SqlBulkCopyColumnMapping("H_eName", "H_eName"); //BulkToDB(dt, "Bak_Tts_Hotel_Name", mapping); */
using (SqlConnection conn = new SqlConnection(DBHelper.ConnectionString))
{
//SqlBulkCopy bulkCopy = new SqlBulkCopy(conn); //用其它源的數據有效批量加載sql server表中
//指定大容量插入是否對表激發觸發器。此屬性的默認值為 False。
SqlBulkCopy bulkCopy = new SqlBulkCopy(DBHelper.ConnectionString, SqlBulkCopyOptions.FireTriggers);
bulkCopy.DestinationTableName = targetTableName; //服務器上目標表的名稱
bulkCopy.BatchSize = sourceDataTable.Rows.Count; //每一批次中的行數
//bulkCopy.BulkCopyTimeout = 300; //超時之前操作完成所允許的秒數,大批量數量需要的時長5分鍾,2013-11-6備注 報錯:“超時時間已到。在操作完成之前超時時間已過或服務器未響應” 解決辦法:
if (sourceDataTable != null && sourceDataTable.Rows.Count != 0)
{
for (int i = 0; i < mapping.Length; i++)
bulkCopy.ColumnMappings.Add(mapping[i]);
//將提供的數據源中的所有行復制到目標表中
bulkCopy.WriteToServer(sourceDataTable);
}
}
C# 調用BulkToDB方法:
int kk = Environment.TickCount; DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("UserID", typeof(string))); dt.Columns.Add(new DataColumn("UserName", typeof(string))); for (int k = 0; k < 10000; k++) //40000 { DataRow dr = dt.NewRow(); dr["UserID"] = k; dr["UserName"] = "8888 - " + k; dt.Rows.Add(dr); } SqlBulkCopyColumnMapping[] mapp = new SqlBulkCopyColumnMapping[2]; mapp[0] = new SqlBulkCopyColumnMapping("UserID", "UserID"); mapp[1] = new SqlBulkCopyColumnMapping("UserName", "UserName"); //提交任務表 BulkToDB(dt, "Test", mapp); int exeg = Environment.TickCount - kk; MessageBox.Show(exeg.ToString());
動態加載數據列名:
SqlBulkCopyColumnMapping[] mapp = new SqlBulkCopyColumnMapping[dt.Columns.Count]; for (int j = 0; j < dt.Columns.Count; j++) { mapp[j] = new SqlBulkCopyColumnMapping(dt.Columns[j].ColumnName, dt.Columns[j].ColumnName); }
1、--處理的觸發器示例 create trigger tr_insert on 表 instead of insert --注意觸發器的類型 as --更新已經存在的主鍵 update 表 set name=b.name,sex=b.sex from 表 a join inserted b on a.id=b.id --插入存在的主鍵數據 insert 表 select a.* from inserted a left join 表 b on a.id=b.id where b.id is null go —————————————————————————————————————————— 2、--觸發器 CREATE TRIGGER tri_edit ON tab INSTEAD OF INSERT AS if exists(select col1,col2 from tab join inserted on tab.學號=INSERTED.學號) begin --這里面你可以加如些其他修改操作,取決於具體的功能 update tab set col1='num1' from tab join inserted on tab.學號=inserted.學號 end else insert tab select * from inserted GO