在SQL2000里怎样复制一条字段N多且带主键的记录呢?

前两天做项目的时候发现需要将一条有300多个字段的记录复制一下,当时绞尽脑汁想用一两条SQL语句直接实现,发现真的好难啊,也可能是我SQL没学好。
1、当表中无主键列时,当然好办:
INSERT INTO TablenameA SELECT * FROM TablenameB WHERE * * *
2、如果表中有主键列,字段不太多时,也可以用这个:
Set IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }
允许/不允许将显式值插入表的标识列中,然后再使用INSERT语句。
3、要是字段上百,而且很多这样的表都要这样做呢?具体情况是:
(1)表中有个自增字段作为主键列,
(2)产品序列号字段CP_SN,新复制出的记录产品序列号不能变,记录的其他信息可以修改,而原来记录的产品信息都是作为备份使用的。
(3)判断字段BF_Result,用来标示哪个记录是新复制的,哪个记录是原来的。

具体的C#做法:
(1)插入一条新记录,这样既设定了CP_SN和判断字段值,有把自增主键列的问题解决了。
    cmd_Insert=new SqlCommand("insert into "+TableName+" (CP_SN,BF_Result) values("+Convert.ToInt64(lbl_CP_SN.Text.Trim())+",2)",this_Connection);
    cmd_Insert.ExecuteNonQuery();
(2)读取原记录内容,取得每个字段的类型和字段值、字段名。由于不同的字段类型,Update语句不一样,所以在对日期和字符串类型的更新时,要使用' " + + " ',
而数值型就用" + + ",在对布尔类型字段读取出来的值是 True 和 False,这也需要注意一下,而且这里数值型的字段不能为空。
    cmd_Select=new SqlCommand("select * from "+TableName+" where CP_SN="+Convert.ToInt64(lbl_CP_SN.Text.Trim())+" and BF_Result=0",this_Connection);
    rdr=cmd_Select.ExecuteReader();

    int i=0;
    int FieldCount=rdr.FieldCount;

    string[] ArrayFieldName=new string[FieldCount];
    string[] ArrayValue=new string[FieldCount];
    string[] ArrayType=new string[FieldCount];
    if(rdr.Read()==true)
    {
     for(i=0;i<FieldCount;i++)
     {
      ArrayFieldName[i]=rdr.GetName(i).ToString().Trim();
      if(rdr.GetValue(i).ToString().Trim()=="")
       ArrayValue[i]="";
      else
       ArrayValue[i]=rdr.GetValue(i).ToString().Trim();
      if(ArrayValue[i]=="True")
       ArrayValue[i]="1";
      else
      {
       if(ArrayValue[i]=="False")
       {
        ArrayValue[i]="0";
       }
      }
      ArrayType[i]=rdr.GetFieldType(i).ToString().Trim();
     }    
    }
    rdr.Close(); 
    
    for(i=1;i<FieldCount-1;i++)
    {
     if(ArrayType[i]=="System.String"||ArrayType[i]=="System.DateTime")
     {
      cmd_Update=new SqlCommand("Update "+TableName+" set "+ArrayFieldName[i]+"='"+ArrayValue[i]+"' where CP_SN="+Convert.ToInt64(lbl_CP_SN.Text.Trim())+" and BF_Result=2",this_Connection);
      cmd_Update.ExecuteNonQuery();
     }
     else
     {
      cmd_Update=new SqlCommand("Update "+TableName+" set "+ArrayFieldName[i]+"="+ArrayValue[i]+" where CP_SN="+Convert.ToInt64(lbl_CP_SN.Text.Trim())+" and BF_Result=2",this_Connection);
      cmd_Update.ExecuteNonQuery();
     } 
    }


posted on 2005-09-19 18:57  扎悉的乐  阅读(791)  评论(0)    收藏  举报

导航