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

create proc spGenInsertSQL
@TableName as varchar(100)
as
--declare @TableName varchar(100)
--set @TableName = 'orders'
--set @TableName = 'eeducation'
DECLARE xCursor CURSOR FOR
SELECT name,xusertype
FROM syscolumns
WHERE (id = OBJECT_ID(@TableName))
declare @F1 varchar(100)
declare @F2 integer
declare @SQL varchar(8000)
set @sql ='SELECT ''INSERT INTO ' + @TableName + ' VALUES('''
OPEN xCursor
FETCH xCursor into @F1,@F2
WHILE @@FETCH_STATUS = 0
BEGIN
    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,@F2
END
CLOSE xCursor
DEALLOCATE xCursor
set @sql = left(@sql,len(@sql) - 5) + ' + '')'' FROM ' + @TableName
--print @sql
exec (@sql)


--第二版:2003.03.08
go


alter proc SPGenInsertSQL (@tablename varchar(256))
as
begin
  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))
as
begin
  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.
// ==============================================================================

posted @ 2003-03-09 23:18  于斯人也  阅读(333)  评论(0编辑  收藏  举报