zoukankan      html  css  js  c++  java
  • 根据基本表结构及其数据生成 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.
    // ==============================================================================

  • 相关阅读:
    Python3+Selenium3自动化测试-(四)
    Python3+Selenium3自动化测试-(三)
    Python3+Selenium3自动化测试-(二)
    Python3+Selenium3自动化测试-(一)
    Python3+Selenium3自动化测试-(准备)
    mysql报错MySQLSyntaxErrorException: Specified key was too long; max key length is 767 byte
    C# 基础Array
    c# 基础之方法
    c#之初识结构(Struct)
    c# 之Enum--枚举
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/2485787.html
Copyright © 2011-2022 走看看