根据基本表结构及其数据生成 INSERT ... 的 SQL

    技术2022-05-11  95

    create proc spGenInsertSQL@TableName as varchar(100)as--declare @TableName varchar(100)--set @TableName = 'orders'--set @TableName = 'eeducation'DECLARE xCursor CURSOR FORSELECT name,xusertypeFROM syscolumnsWHERE (id = OBJECT_ID(@TableName))declare @F1 varchar(100)declare @F2 integerdeclare @SQL varchar(8000)set @sql ='SELECT ''INSERT INTO ' + @TableName + ' VALUES('''OPEN xCursorFETCH xCursor into @F1,@F2WHILE @@FETCH_STATUS = 0BEGIN    set @sql =@sql +              + case when @F2 IN (35,58,99,167,175,231,239,61) then ' + case when ' + @F1 + ' IS NULL then '''' else '''''''' end + '  else '+' end              + 'replace(ISNULL(cast(' + @F1 + ' as varchar),''NULL''),'''''''','''''''''''')'               + case when @F2 IN (35,58,99,167,175,231,239,61) then ' + case when ' + @F1 + ' IS NULL then '''' else '''''''' end + '  else '+' end              + char(13) + ''','''     FETCH NEXT FROM xCursor into @F1,@F2ENDCLOSE xCursorDEALLOCATE xCursorset @sql = left(@sql,len(@sql) - 5) + ' + '')'' FROM ' + @TableName--print @sqlexec (@sql)

    --第二版:2003.03.08go

    alter proc SPGenInsertSQL (@tablename varchar(256))asbegin  declare @sql varchar(8000)  declare @sqlValues varchar(8000)  set @sql =' ('  set @sqlValues = 'values (''+'  select @sqlValues = @sqlValues + cols + ' + '','' + ' ,@sql = @sql + '[' + name + '],'     from         (select case                   when xtype in (48,52,56,59,60,62,104,106,108,122,127)                                                       then 'case when '+ name +' is null then ''NULL'' else ' + 'cast('+ name + ' as varchar)'+' end'                  when xtype in (58,61)                       then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'cast('+ name +' as varchar)'+ '+'''''''''+' end'           when xtype in (167)                       then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end'                  when xtype in (231)                       then 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end'                  when xtype in (175)                       then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'cast(replace('+ name+','''''''','''''''''''') as Char(' + cast(length as varchar)  + '))+'''''''''+' end'                  when xtype in (239)                       then 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'cast(replace('+ name+','''''''','''''''''''') as Char(' + cast(length as varchar)  + '))+'''''''''+' end'                  else '''NULL'''                end as Cols,name           from syscolumns            where id = object_id(@tablename)         ) T   set @sql ='select ''INSERT INTO ['+ @tablename + ']' + left(@sql,len(@sql)-1)+') ' + left(@sqlValues,len(@sqlValues)-4) + ')'' from '+@tablename  --print @sql  exec (@sql)end

    go--第三版: 2003.3.9

    ALTER   proc SPGenInsertSQL (@tablename varchar(256))asbegin  declare @sql varchar(8000)  declare @sqlValues varchar(8000)  set @sql =' ('  set @sqlValues = 'values (''+'  select @sqlValues = @sqlValues + cols + ' + '','' + ' ,@sql = @sql + '[' + name + '],'     from         (select case                   when xtype in (48,52,56,59,60,62,104,106,108,122,127)                                                       then 'case when '+ name +' is null then ''NULL'' else ' + 'cast('+ name + ' as varchar)'+' end'                  when xtype in (58,61)                       then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'cast('+ name +' as varchar)'+ '+'''''''''+' end'           when xtype in (167,175)                       then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+''''''''' + ' end'                  when xtype in (231,239)                       then 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+''''''''' + ' end'                  else '''NULL'''                end as Cols,name           from syscolumns            where id = object_id(@tablename) and autoval is null        ) T   set @sql ='select ''INSERT INTO ['+ @tablename + ']' + left(@sql,len(@sql)-1)+') ' + left(@sqlValues,len(@sqlValues)-4) + ')'' from '+@tablename  print @sql  exec (@sql)/*select *from syscolumns  where id = object_id('test') and autoval is null*/end

    --

    C# DataSet SqlDataReader:using System;using System.Data;using System.Xml;using System.Data.SqlClient;using System.Collections;//using Microsoft.ApplicationBlocks.Data

    public class Class1{ [STAThread] //应 ClipBoard 需要 static void Main(string[] args) {    System.Console.WriteLine("pls enter Server:");    string S = System.Console.ReadLine();      System.Console.WriteLine("pls enter DataBase:");    string D = System.Console.ReadLine();      System.Console.WriteLine("pls enter User:");    string U = System.Console.ReadLine();      System.Console.WriteLine("pls enter Password:");    string P = System.Console.ReadLine();      System.Console.WriteLine("pls enter SQL:");    string sql = System.Console.ReadLine();  //

      // DataReader  //string sql = "select top 2 * from products";  //sql = "select * from orders /n select * from [order details]";  string ConnectionString = @"Server=" + S + ";Database=" + D + ";User ID=" + U + ";Password=" + P;

      //下面引用 Microsoft SqlHelper 得到 SqlDataReader  SqlDataReader x = SqlHelper.ExecuteReader(ConnectionString,System.Data.CommandType.Text, sql);  System.Console.WriteLine("/nuse SqlDataReader :");  System.Windows.Forms.Clipboard.SetDataObject(GenerateInsertInToSQLData(x,false),true);

      System.Console.WriteLine("/npls paste (ctrl + v)!");  System.Console.ReadLine();

      // DataSet  System.Data.SqlClient.SqlConnection sc = new System.Data.SqlClient.SqlConnection(ConnectionString);  //下面引用 Microsoft SqlHelper 得到 DataSet  DataSet ds = SqlHelper.ExecuteDataset(sc, System.Data.CommandType.Text, sql);  //SqlParameter [] spa = SqlHelperParameterCache.GetSpParameterSet(sc,"zsp_calendar");  //spa[0].Value = System.DateTime.Parse("1995-09-09");  //DataSet ds = SqlHelper.ExecuteDataset(sc,CommandType.StoredProcedure,"zsp_calendar",spa);  System.Console.WriteLine("/nuse DataSet :");  System.Windows.Forms.Clipboard.SetDataObject(GenerateInsertInToSQLData(ds,true),true);  System.Console.WriteLine("/npls paste (ctrl + v)!");  System.Console.ReadLine();

     } public static string GenerateInsertInToSQLData(DataSet ds,bool IgnoreBigColumn) {  System.Text.StringBuilder sb = new System.Text.StringBuilder();  int j = 0;  string bs = ""; //用于记录上次的位数  System.Console.Write("/n正在进行第    ");  foreach (DataTable dt in ds.Tables)  {   bool b = true;   if (sb.Length > 0)    sb.Append("/n");   string s = "";   foreach (DataRow dr in dt.Rows)   {    bool B;    string r = "";    if (sb.Length > 0)     sb.Append("/n");    foreach (DataColumn dc in dt.Columns)    {     B = true;     if (r != "" && !r.EndsWith(","))      r += ",";     if (s != "" && !s.EndsWith(",") && b)      s += ",";     switch (dc.DataType.FullName)     {      case "System.Boolean" :       r += dr[dc] == System.DBNull.Value ? "null" : ((bool) dr[dc] ) ? "1" : "0";       break;      case "System.Decimal" :       goto case "System.Int32";      case "System.Double" :       goto case "System.Int32";      case "System.Int16" :       goto case "System.Int32";      case "System.Int64" :       goto case "System.Int32";      case "System.Single" :       goto case "System.Int32";      case "System.UInt16" :       goto case "System.Int32";      case "System.UInt32" :       goto case "System.Int32";      case "System.UInt64" :       goto case "System.Int32";      case "System.Int32" :       r += dr[dc] == System.DBNull.Value ? "null" : dr[dc].ToString();       break;      case "System.Char" :       goto case "System.String";      case "System.DateTime" :       goto case "System.String";      case "System.String" :       r += dr[dc] == System.DBNull.Value ? "null" : "'" + dr[dc].ToString().Replace("'","''") + "'";       break;      default :       if (IgnoreBigColumn)       {        B = false;       }       else       {        r += "null";       }       break;     }     if (b && B)     {      s += "[" + dc.ColumnName + "]";     }    }    sb.Append("insert into [" + dt.TableName + "] (" + s + ") values (" + r + ")");    b = false;    System.Console.Write(bs + "/b/b/b" + ++j + " 次," + System.DateTime.Now);    bs = new string('/b',Digits(j) + System.DateTime.Now.ToString().Length + 1); //19 为日期时间字符串长度, 1 是 ","       }  }  return sb.ToString(); } public static string GenerateInsertInToSQLData(SqlDataReader sdr,bool IgnoreBigColumn) {  System.Text.StringBuilder sb = new System.Text.StringBuilder();  int j = 0;  int k = 0;  string bs = ""; //用于记录上次的位数  System.Console.Write("/n正在进行第    ");  do  {   bool b = true;   if (sb.Length > 0)    sb.Append("/n");   string s = "";   while (sdr.Read())   {    bool B;    string r = "";    if (sb.Length > 0)     sb.Append("/n");    for (int i = 0; i < sdr.FieldCount; i++)    {     B = true;     if (r != "" && !r.EndsWith(","))      r += ","; //数据行     if (s != "" && !s.EndsWith(",") && b)      s += ","; //字段列表     switch (sdr.GetDataTypeName(i))     {      case "bit" :       r += sdr.IsDBNull(i) ? "null" : ((bool) sdr[i]) ? "1" : "0";       break;      case "bigint" :       goto case "int";      case "smallint" :       goto case "int";      case "tinyint" :       goto case "int";      case "decimal" :       goto case "int";      case "numeric" :       goto case "int";      case "money" :       goto case "int";      case "smallmoney" :       goto case "int";      case "float" :       goto case "int";      case "real" :       goto case "int";      case "int" :       r += sdr.IsDBNull(i) ? "null" : sdr[i].ToString();       break;      case "datetime" :       goto case "varchar";      case "smalldatetime" :       goto case "varchar";      case "char" :       goto case "varchar";      case "text" :       goto case "varchar";      case "varchar" :       r += sdr.IsDBNull(i) ? "null" : "'" + sdr[i].ToString().Replace("'","''") + "'";       break;      case "nchar" :       goto case "nvarchar";      case "ntext" :       goto case "nvarchar";      case "nvarchar" :       //sb.Append(sdr.IsDBNull(i) ? "null" : "N'" + sdr[i].ToString().Replace("'","''") + "'");;       r += sdr.IsDBNull(i) ? "null" : "N'" + sdr[i].ToString().Replace("'","''") + "'";       break;      default :       if (IgnoreBigColumn)       {        B = false;       }       else       {        r += "null";       }       break;     }     if (b && B)     {      s += "[" + sdr.GetName(i) + "]";     }    }    sb.Append("insert into [Table" + k + "] (" + s + ") values (" + r + ")");    b = false;    System.Console.Write(bs + "/b/b/b" + ++j + " 次," + System.DateTime.Now);    bs = new string('/b',Digits(j) + System.DateTime.Now.ToString().Length + 1); //19 为日期时间字符串长度, 1 是 ","   }   k ++;  } while(sdr.NextResult());  return sb.ToString(); }

     static int Digits(int n) //数字所占位数 {  n = System.Math.Abs(n) ;  n = n/10;  int i = 1;  while (n > 0)  {   n = n / 10;   i++;  }  return i; }}

    // 下面是 Microsoft SqlHelper :

    // ===============================================================================// Microsoft Data Access Application Block for .NET// http://msdn.microsoft.com/library/en-us/dnbda/html/daab-rm.asp//// SQLHelper.cs//// This file contains the implementations of the SqlHelper and SqlHelperParameterCache// classes.//// For more information see the Data Access Application Block Implementation Overview. // ===============================================================================// Release history// VERSION DESCRIPTION//   2.0 Added support for FillDataset, UpdateDataset and "Param" helper methods//// ===============================================================================// Copyright (C) 2000-2001 Microsoft Corporation// All rights reserved.// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR// FITNESS FOR A PARTICULAR PURPOSE.// ==============================================================================


    最新回复(0)