• 转:一段有用的SQL代码


    其功能是:将表中的数据生成SQL脚本,在查询分析器中执行这些脚本后自动将数据导入到SQL Server中

    -- =============================================
    -- Author:      佚名
    -- Description: 将表中的数据转换成Insert语句的集
    --              合的通用存储过程
    -- =============================================
    CREATE PROCEDURE  sp_ConvertDataToInsertSql
        @tablename   sysname   -- source table name
    AS
    BEGIN
        DECLARE   @column   varchar(1000)
        DECLARE   @columndata   varchar(1000)
        DECLARE   @sql   varchar(4000)
        DECLARE   @xtype   tinyint
        DECLARE   @name   sysname
        DECLARE   @objectId   int
        DECLARE   @objectname   sysname
        DECLARE   @ident   int
    
        SET NOCOUNT ON
    
        SET @objectId=object_id(@tablename)
        -- 判断对象是否存在
        IF @objectId IS NULL
        BEGIN
            print  @tablename +  '对象不存在'
            RETURN
        END
    
        SET @objectname=RTRIM(object_name(@objectId))
        IF @objectname IS NULL OR CHARINDEX(@objectname,@tablename) = 0
        BEGIN
            print  @tablename +  '对象不在当前数据库中'     
            RETURN
        END
        --判断对象是否是表
        IF OBJECTPROPERTY(@objectId,'IsTable') <> 1
        BEGIN
            print @tablename + '对象不是表'
            RETURN
        END
    
        SELECT @ident=status&0x80
          FROM syscolumns
         WHERE id=@objectid
           AND status&0x80=0x80
        IF @ident IS NOT NULL
            PRINT 'SET   IDENTITY_INSERT   '+ @TableName + '   ON'
    
        --定义游标,循环取数据并生成Insert语句
        DECLARE syscolumns_cursor CURSOR FOR
            SELECT c.name,c.xtype FROM syscolumns c
             WHERE c.id=@objectid
             ORDER BY c.colid
        --打开游标
        open syscolumns_cursor
        SET @column=''
        SET @columndata=''
        FETCH NEXT FROM syscolumns_cursor INTO @name, @xtype
        WHILE @@fetch_status <> -1
        BEGIN
            IF @@fetch_status <> -2
            BEGIN 
                --timestamp不需处理,image,text,ntext,sql_variant 暂时不处理
                IF @xtype NOT IN(189,34,35,99,98)
                    BEGIN
                    SET @column=@column +
                        CASE WHEN len(@column)=0 THEN '' ELSE ',' END + @name
                    SET @columndata = @columndata +
                        CASE WHEN len(@columndata)=0 THEN '' ELSE ','','',' END +
                        CASE WHEN @xtype IN(167,175) THEN '''''''''+' + @name+'+'''''''''   --varchar,char
                             WHEN @xtype IN(231,239) THEN '''N''''''+' + @name+'+'''''''''   --nvarchar,nchar
                             WHEN @xtype=61 THEN '''''''''+convert(char(23),' + @name+',121)+'''''''''   --datetime
                             WHEN @xtype=58 THEN '''''''''+convert(char(16),' + @name+',120)+'''''''''   --smalldatetime
                             WHEN @xtype=36 THEN '''''''''+convert(char(36),' + @name+')+'''''''''   --uniqueidentifier
                             ELSE @name
                    END
                END
            END
            FETCH NEXT FROM syscolumns_cursor INTO @name,@xtype
        END
        -- 关闭游标
        CLOSE   syscolumns_cursor
        DEALLOCATE   syscolumns_cursor
    
        SET @sql = 'SET NOCOUNT ON SELECT ''INSERT '
            + @tablename + '(' + @column + ') VALUES(''as ''--'','
            + @columndata + ','')'' FROM ' + @tablename
        PRINT '--'+@sql
    
        EXEC(@sql)
        IF @ident IS NOT NULL
            PRINT 'SET IDENTITY_INSERT '+@TableName+' OFF'
    END

    调用存储过程:

    EXEC sp_ConvertDataToInsertSql 'persons' 

    得到的结果集类似下面的数据:

    INSERT persons(username,lastname,firstname,city,id) VALUES('Bill','Bill','Zheng','Xuzhou',1)
  • 相关阅读:
    字集码(字符编码)
    图片轮播(可实现手动与自动的切换)
    Eclipse常用快捷键
    Java并发编程:Callable、Future和FutureTask
    Java并发之CountDownLatch、CyclicBarrier和Semaphore
    java注解
    JVM加载class原理
    阿里中间件技术及双十一实践--软负载——分布式系统的引路人
    阿里中间件技术及双十一实践--中间件总体介绍
    Java的LockSupport.park()实现分析
  • 原文地址:https://www.cnblogs.com/EasonWu/p/1142780.html
Copyright © 2020-2023  润新知