转:一段有用的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)

 

你可能感兴趣的:(sql代码)