需求如下:
現有一批表(都有地區唯一編碼列,和主鍵列),每次根據用戶選擇,操作哪一張
每次用戶會提前選好待填充地區A 參照地區B,具體操作表Table1,需要:
1. 在Table1中刪除地區A的數據
2. 查到Table1中地區B的數據
3. 將2中查到的數據,作爲地區A新增至Table1中
因爲不同表的列不一樣,所以單純寫插入語句【INSERT INTO Table1 (列名,列名,列名) SELECT 列名,列名,列名 FROM Table1】既慢又不可複用,有幾張表就要寫幾遍,感覺不是很聰明。
這裏我的思路是建個臨時表接數據 修改地區唯一編碼列後 刪掉主鍵 就可以直接用SELECT *出來的東西INSERT進去,代碼如下:
/// <summary>
/// 刪除基礎數據表中對應數據 然後再複製一份
/// </summary>
/// <param name="xzqh">行政區劃</param>
/// <param name="czxzqh">參照行政區劃</param>
/// <param name="ysb">基礎數據表名</param>
/// <returns></returns>
public bool DelJCSJ_ByXZQH(string xzqh,string czxzqh,string ysb)
{
sbr.Clear();
ht.Clear();
//先獲取主鍵列 列名備用
sbr.AppendLine("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='" + ysb + "' AND COLUMNPROPERTY(OBJECT_ID('" + ysb + "'),COLUMN_NAME,'IsIdentity')=1 ;");
string strZJName = ComVar.sqlda.GetStr(sbr, ht);
if (!string.IsNullOrWhiteSpace(strZJName))
{
sbr.Clear();
//刪除表中當前行政區劃數據
sbr.AppendLine("delete FROM " + ysb + " where XZQHDM='" + xzqh + "';");
//將參照地區數據查出到臨時表
sbr.AppendLine("SELECT * INTO #" + ysb + "_copy FROM " + ysb + " WHERE XZQHDM = '" + czxzqh + "'; ");
//刪除無用主鍵標識列
sbr.AppendLine("ALTER TABLE #" + ysb + "_copy DROP COLUMN " + strZJName + "; ");
//行政區劃改爲當前
sbr.AppendLine("UPDATE #" + ysb + "_copy SET XZQHDM='" + xzqh + "'; ");
//插入數據
sbr.AppendLine("INSERT INTO " + ysb + " SELECT * FROM #" + ysb + "_copy; ");
sbr.AppendLine("DROP TABLE #" + ysb + "_copy; ");
return ComVar.sqlda.SetDataSet(sbr, ht);
}
else
{
return false;//沒有主鍵 沒法操作
}
}