MSSQL存储过程生成insert into 语句

2020-06-11  本文已影响0人  _意义
USE [数据库]
GO

/****** Object:  StoredProcedure [dbo].[sp_get_InsertSql]    Script Date: 2020/5/20 17:13:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[sp_get_InsertSql]
    --@dbName              VARCHAR ( 32)= '' ,    -- 数据库名称
    @tabList          VARCHAR ( max )-- 要导出数据的表名,表名之间用逗号隔开
AS

    DECLARE

       @dbName  VARCHAR ( 32),

       @IncludeIdentity  BIT = 1,

       @index     INT ,

       @wi        INT ,

       @SQL       VARCHAR ( max ),

       @SQL1      VARCHAR ( max ),

       @tabName   VARCHAR ( 128) ,

       @colName   VARCHAR ( 128),

       @colType   VARCHAR ( 128),

       @tabPrefix VARCHAR ( 32),

       @cols      VARCHAR ( max ),

       @colsData  VARCHAR ( max ),

       @SQLWhere  VARCHAR ( 1024),       

       @SQLIdentityOn    VARCHAR ( MAX ),

       @SQLIdentityOff VARCHAR ( MAX );

          
    DECLARE @t_tb TABLE ( TB varchar ( 128), Sqlwhere varchar ( 1024), SN BIGINT IDENTITY ( 1, 1))

    DECLARE @tb TABLE ( insert_sql VARCHAR ( max ), SN BIGINT IDENTITY ( 1, 1));

    DECLARE @colList TABLE ( colName VARCHAR ( 128), colType VARCHAR ( 128),

       colValueL VARCHAR ( 120), colValueR VARCHAR ( 120), selColName VARCHAR ( 128));

BEGIN

    SET NOCOUNT ON

    SET @tabList = REPLACE ( @tabList, CHAR ( 9), '' )

    SET @tabList = REPLACE ( @tabList, CHAR ( 10), '' )

    SET @tabList = REPLACE ( @tabList, CHAR ( 13), '' )

    SET @dbName = LTRIM ( RTRIM ( @dbName))

    SET @index = CHARINDEX ( ',' , @tabList)

    IF LEN ( @dbName) > 0

       SET @tabPrefix = @dbName + '..'

    ELSE

       SET @tabPrefix = '' ;

    WHILE @index > 0 AND @index IS NOT NULL

    BEGIN

       SET @tabName = SUBSTRING ( @tabList, 1, @index- 1)       

       SET @wi= CHARINDEX ( ' where' , LTRIM ( @tabName))

       IF @wi= 0

           SET @wi = LEN ( @tabName)

 
       INSERT INTO @t_tb( tb, Sqlwhere) VALUES ( SUBSTRING ( @tabName, 1, @wi), SUBSTRING ( @tabName, @wi+ 1, LEN ( @tabName)- @wi))

       SET @tabList = SUBSTRING ( @tabList, @index+ 1, LEN ( @tabList)- @index)

       SET @index = CHARINDEX ( ',' , @tabList)

    END

    IF @index = 0 OR @index IS NULL

       SET @tabName = @tabList

    ELSE

       SET @tabName = SUBSTRING ( @tabList, 1, @index)

    SET @wi= CHARINDEX ( ' where' , LTRIM ( @tabName))


    IF @wi= 0

       SET @wi = LEN ( @tabName)

    INSERT INTO @t_tb( tb, Sqlwhere) VALUES ( SUBSTRING ( @tabName, 1, @wi), SUBSTRING ( @tabName, @wi+ 1, LEN ( @tabName)- @wi))

    SELECT @SQL1 = 'select INSERT_SQL='';SET NOCOUNT ON'  +  ' union all '

    DECLARE tab_cur CURSOR FOR

    SELECT t. name , tb. Sqlwhere FROM sys.tables t

    INNER JOIN @t_tb tb ON t. name = RTRIM ( LTRIM ( tb. TB))

    ORDER BY tb. SN     

    OPEN tab_cur

    FETCH NEXT FROM tab_cur INTO @tabName, @SQLWhere

    WHILE @@FETCH_STATUS = 0 BEGIN

       DELETE FROM @colList

       IF NOT EXISTS( SELECT 1 FROM sys.objects WHERE name = @tabName AND type = 'U' ) BEGIN

           PRINT ( @tabName + N' no exist! ' )

           RAISERROR ( @tabName, 16, - 1);

           FETCH NEXT FROM tab_cur INTO @tabName, @SQLWhere

           CONTINUE ;

       END

      

       INSERT INTO @colList( colName, colType, colValueL, colValueR)

       SELECT c. NAME , t. name , '' , ''

       FROM sys.columns c

       INNER JOIN sys.tables tab

           ON c. object_id = tab. object_id

       INNER JOIN sys.types t

           ON c. user_type_id = t. user_type_id

       WHERE c. is_computed= 0

           AND tab. name = @tabName

 

       IF @IncludeIdentity= 0

           DELETE FROM @colList WHERE colName IN(

              SELECT name FROM sys.columns WHERE object_id = OBJECT_ID ( @tabName) AND is_identity= 1)

             

       UPDATE @colList SET colValueL= 'RTRIM(' , colValueR = ')'

       WHERE colType IN( 'text' , 'varchar' , 'nvarchar' , 'char' , 'uniqueidentifier' , 'datetime2' , 'nchar' , 'sysname' )

      
       SELECT @cols= '' , @colsData = '' , @SQL = '' ;

       UPDATE @colList SET colName = '[' + colName + ']'    

       UPDATE @colList SET selColName= colName   

      
       UPDATE @colList SET colValueL= 'replace(' + colValueL, colValueR = colValueR+ ','''''''','''''''''''')'

       WHERE colType IN( 'text' , 'varchar' , 'nvarchar' , 'char' , 'nchar' , 'sysname' )  

          

       UPDATE @colList SET colValueL=

           CASE WHEN colType IN( 'text' , 'varchar' , 'nvarchar' , 'char' , 'uniqueidentifier' , 'datetime2' , 'nchar' , 'sysname' ) THEN '''''''''+' ELSE '' END

              + colValueL,

           colValueR = colValueR + CASE WHEN colType IN( 'text' , 'varchar' , 'nvarchar' , 'char' , 'nchar' , 'datetime2' , 'uniqueidentifier' , 'sysname' ) THEN '+''''''''' ELSE '' END

       SELECT @cols = @cols + colName + ', ' ,

           @colsData = @colsData + 'isnull(' +

              colValueL +          

              CASE WHEN colType= 'datetime2' THEN 'convert(varchar(20),' + colName+ ',120)'

              WHEN colType= 'uniqueidentifier' THEN 'convert(varchar(50),' + colName+ ')'

              WHEN colType= 'text' THEN 'convert(nvarchar(max),' + colName+ ')'

              WHEN colType= 'sysname' THEN 'convert(nvarchar(max),' + colName+ ')'

              WHEN colType= 'varbinary' OR colType= 'BINARY' OR colType= 'image'

                  THEN 'master.dbo.fn_varbintohexsubstring(1,' + colName+ ',1,0)'              

              ELSE   'cast(' + colName+ ' as nvarchar(max))' END

              + colValueR + ',''null'')+'', ''+'

       FROM @colList

       SELECT @cols = LEFT( @cols, LEN ( @cols)- 1),

              @colsData = LEFT( @colsData, LEN ( @colsData)- 5),

              @SQL =  'select INSERT_SQL='''' union all '

       SELECT @cols = 'select INSERT_SQL=''INSERT INTO ' + @tabPrefix + @tabName + '(' + @cols+ ')' ,

           @colsData = ' VALUES(''+' + @colsData + '+'');'' FROM ' + @tabPrefix + @tabName

       SELECT @colsData = @colsData + ' ' + ISNULL ( @SQLWhere, '' ) 

       IF @IncludeIdentity= 1 AND EXISTS( SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID ( @tabName) AND is_identity= 1)

       BEGIN

           SELECT @SQLIdentityOn = 'select INSERT_SQL=''SET IDENTITY_INSERT ' + @tabPrefix + @tabName + ' ON;''' +

                  ' union all ' ,

              @SQLIdentityOff = ' union all ' + 'select INSERT_SQL=''SET IDENTITY_INSERT ' + @tabPrefix + @tabName + ' OFF;'''

       END

       ELSE

       BEGIN

           SELECT @SQLIdentityOff = '' ,

              @SQLIdentityOn = '' ;

       END

       INSERT INTO @tb( insert_sql)

       EXECUTE (  @SQL+ @SQLIdentityOn + @cols+ @colsData + @SQLIdentityOff)

       FETCH NEXT FROM tab_cur INTO @tabName, @SQLWhere

    END

    CLOSE tab_cur

    DEALLOCATE tab_cur

    SELECT insert_sql FROM @tb

END

GO

用法: tabList以,分隔。

 @GetMapping( "/getInsert")
 public ReturnResult getInsertSql(String tabList) {
        ReturnResult retVal = new ReturnResult();
        try {
             List<?> resultList = jdbcTemplate.execute(new CallableStatementCreator() {
                public CallableStatement createCallableStatement(Connection con) throws SQLException {
                    String storedProc = "{call sp_get_InsertSql(?)}";
                    CallableStatement cs = con.prepareCall(storedProc);
                    cs.setString(1, tabList);
                    return cs;
                }
            }, cs-> {
                List<String> list = new ArrayList<>();
                try (ResultSet rs = cs.executeQuery()) {
                    ResultSetMetaData rmd = rs.getMetaData();
                    int columnCount = rmd.getColumnCount();
                    while (rs.next()) {
                        list.add("" + rs.getObject(columnCount));
                    }
                } 
                return list;
            });
            retVal.setResult(resultList);
            return retVal;
        } catch (Exception e) {
            retVal.setMessage(e.getMessage());
            retVal.setFlag(false);
            retVal.setErrorCode(ViBorderUtil.getErrorCode(ErrorCode.E250001));
            return retVal;
        }
}
上一篇下一篇

猜你喜欢

热点阅读