zoukankan      html  css  js  c++  java
  • SqlServer:SqlServer(sql,游标,定时作业,行转列,列转行,公用表达式递归,merge合并)

    1.加载驱动:

      

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    DriverManager.getConnection("jdbc:sqlserver://192.168.0.63:1433;DatabaseName=test","sa","hnzsfwq");

    2.分页:

     --top not in方式  
    select top 条数 *  from tablename  
    where Id not in (select top 条数*页数  Id from tablename)  
      
      
      
    --ROW_NUMBER() OVER()方式   
     select * from (   
        select *, ROW_NUMBER() OVER(Order by Id ) AS RowNumber from tablename  
      ) as b  
      where RowNumber BETWEEN 当前页数-1*条数 and 页数*条数     
      
      
      
    --offset fetch next方式  
    --SQL2012以上的版本才支持  
    select * from tablename  
     order by Id offset 页数 row fetch next 条数 row only 


    3.查询数据库有几张这张表:

      SELECT COUNT(1) AS NUM FROM [INFORMATION_SCHEMA].[TABLES]WHERE TABLE_NAME= 'TABLENAME'

    4.sql文件,动态判断表中字段是否重复:

      IF NOT EXISTS(

        SELECT * 

        FROM [INFORMATION_SCHEMA].[COLUMNS]

        WHERE [TABLE_NAME] = '$tableName$' AND COLUMN_NAME = '$template_ID$'

      )

      BEGIN 

        ALTER TABLE [$tableName$]

        ADD [$template_ID$] [INT]

      END

      IF NOT EXISTS(

      SELECT * 

      FROM [INFORMATION_SCHEMA].[COLUMNS]

      WHERE [TABLE_NAME] = '$tableName$' AND COLUMN_NAME = '$table_Name$'

      )

      BEGIN 

        ALTER TABLE [$tableName$]

        ADD [$table_Name$] varchar(1000)

      END

    5. 多条件查询:

      SELECT 

        SOURCE_TBL_NAME

      FROM

        [TBL_TABLE_MAPPING]

      WHERE

        TEMP_ID=1

      AND TARGET_TBL_NAME !='query'

      AND TABLEORSQL='sql'

      AND DB_TYPE=0

    6.循环:

      Declare @i INT

      SET @i = 5001

      WHILE  @i <50000

      Begin

      INSERT INTO s_student (id)

        VALUES

        (@i)

      SET@i=@i+1

      END

    7.查询某个表有多少列:

      SELECT

        COUNT(1)

      FROM

        SYSCOLUMNS

      WHERE

        ID=OBJECT_ID('表名')

    8.查询当前时间:

      SELECT  GETDATE()

    9.批量插入:

      URL:

        192.168.0.70:9898/SpagoBIETL/unitTemplateMapping/saveMapping.shtml?mappings[0].unitCode=110&mappings[0].templateID=111

      前端传的是一个数组

      Controller:

          参数:实体类(包含 list<UnitTemplateMapping> mapping 属性)

      list<UnitTemplateMapping> mapping

    <insert id="insertBatch">
        insert into TBL_UNIT_TEMAPLATE_MAPPING(UNIT_CODE,SOFTWARE_ID,TEMPLATE_ID) VALUES
        <foreach collection="list" item="mapping" separator=",">
              (#{mapping.unitCode},#{mapping.softwareId},#{mapping.templateId})
        </foreach>
    </insert> 

       foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况: 

      1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
      2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .
      3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key.

       

    <!--List:forech中的collection属性类型是List,collection的值必须是:list,item的值可以随意,Dao接口中参数名字随意 -->
        <select id="getEmployeesListParams" resultType="Employees">
            select *
            from EMPLOYEES e
            where e.EMPLOYEE_ID in
            <foreach collection="list" item="employeeId" index="index"
                open="(" close=")" separator=",">
                #{employeeId}
            </foreach>
        </select>
    
        <!--Array:forech中的collection属性类型是array,collection的值必须是:list,item的值可以随意,Dao接口中参数名字随意 -->
        <select id="getEmployeesArrayParams" resultType="Employees">
            select *
            from EMPLOYEES e
            where e.EMPLOYEE_ID in
            <foreach collection="array" item="employeeId" index="index"
                open="(" close=")" separator=",">
                #{employeeId}
            </foreach>
        </select>
    
        <!--Map:不单单forech中的collection属性是map.key,其它所有属性都是map.key,比如下面的departmentId -->
        <select id="getEmployeesMapParams" resultType="Employees">
            select *
            from EMPLOYEES e
            <where>
                <if test="departmentId!=null and departmentId!=''">
                    e.DEPARTMENT_ID=#{departmentId}
                </if>
                <if test="employeeIdsArray!=null and employeeIdsArray.length!=0">
                    AND e.EMPLOYEE_ID in
                    <foreach collection="employeeIdsArray" item="employeeId"
                        index="index" open="(" close=")" separator=",">
                        #{employeeId}
                    </foreach>
                </if>
            </where>
        </select>

     10.存储过程(游标):

      双层游标

    USE [wqb_upgrade_test]
    GO
    /****** Object:  StoredProcedure [dbo].[addFinancialBatchExecuteTask]    Script Date: 2018/1/10 18:48:01 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[addFinancialBatchExecuteTask]
      
    AS
        BEGIN
        
        create table unitCodeAccountCode(unitCode varchar(100),accountCode varchar(100));        
        DECLARE @INTERMEDIATEDB_NAME varchar(1000)
        DECLARE @belong_unit_code varchar(1000)
        DECLARE @DATA_YEAR varchar(1000)
        DECLARE My_Cursor CURSOR 
        FOR 
            select distinct w.belong_unit_code as  belongUnitCode, w.DATA_YEAR as  dataYear,s.INTERMEDIATEDB_NAME as interMediatedb
            from
                Spagobietl.dbo.TBL_DATACOLLECTION as s,
                Spagobietl.dbo.TBL_ORIGINAL_DATA_REGISTER as w,
                ETL_COLLECTION as c
                where
                s.exec_stat=2
                and
                s.uuid=w.uuid
                and s.INTERMEDIATEDB_NAME is not null
                and s.INTERMEDIATEDB_NAME in (select name from sys.databases) 
            
            OPEN My_Cursor;
            FETCH NEXT FROM My_Cursor INTO @belong_unit_code,@DATA_YEAR,@INTERMEDIATEDB_NAME
            WHILE @@FETCH_STATUS = 0
                BEGIN
                    DECLARE @fname varchar(1000)             
                    set @fname = @INTERMEDIATEDB_NAME
                    DECLARE @s Nvarchar(1000)
                    set @s = 'select 会计电子账簿编号 as accountCode ,单位代码 as unitCode from ['+@INTERMEDIATEDB_NAME+'].dbo.基础表_财务类_电子账簿信息表 ';        
                    DECLARE @Mx varchar(1000)
                    set @Mx = 
                    'DECLARE My_Cursor2 CURSOR '+                     //此处须拼字符串,执行sql
                    'FOR  (  '+@s+' )'+      // for的括号里不能用 exec
                        'OPEN My_Cursor2; '+
                    'DECLARE @accountCode varchar(8000); '+
                    'DECLARE @unitCode varchar(8000) '+
                    'FETCH NEXT FROM My_Cursor2 INTO @accountCode ,@unitCode '+ 
                    ' WHILE @@FETCH_STATUS = 0 '+
                        'BEGIN '+                         
                            'FETCH NEXT FROM My_Cursor2 INTO @accountCode,@unitCode '+ 
                            'insert into unitCodeAccountCode(unitCode,accountCode) values(@unitCode,@accountCode); '+
                        'END '+ 
                    'CLOSE My_Cursor2; '+
                    'DEALLOCATE My_Cursor2;'
                    
                    execute(@Mx)
                    
                    FETCH NEXT FROM My_Cursor INTO @belong_unit_code,@DATA_YEAR,@INTERMEDIATEDB_NAME
                END
            CLOSE My_Cursor; 
            DEALLOCATE My_Cursor;
    
    
    
        DECLARE @methodModelId int;--方法ID
        DECLARE @unitCode varchar(8000);--单位代码
        DECLARE @year int;--年份
        DECLARE @accountCode varchar(1000);--账套编码
        DECLARE @methodInstanceId int;--方法实例ID
        
        DECLARE UnitCodeYearMethodIdCursor CURSOR
        FOR
        select methodModelId,belong_unit_code,DATA_YEAR,accountCode
        from (
                    SELECT  methodModelID
        FROM    auditMethodModel m
                JOIN auditItem i ON m.itemID = i.itemID
                JOIN dbo.auditCategory c ON c.CategoryID = i.CategoryID
        WHERE   c.isEnable = 1
        and realTime = 1
                AND ( ( i.isEnable = 1
                        AND m.isEnable = 1
                      )
                      OR ( i.isEnable = 1
                           AND m.isEnable IS NULL
                         )
                      OR ( i.isEnable IS NULL )
                    )
                AND ( m.externalDataSource IS NULL
                      OR LEN(RTRIM(m.externalDataSource)) = 0
                    )
                AND ( m.methodType = 'model'
                      OR m.methodType IS NULL
                    )
                AND ( m.autidType != '人工' )
                AND ( m.isPass = 1 )        
                AND NOT EXISTS ( SELECT TOP 1
                                        1
                                 FROM   paramModel p
                                 WHERE  m.methodModelID = p.methodID
                                        AND p.paramName != '会计核算账套'
                                        AND p.paramName != '预算年度'
                                        AND p.paramName != '单位编码' )
                AND EXISTS ( SELECT TOP 1
                                    1
                             FROM   paramModel p
                             WHERE  m.methodModelID = p.methodID
                                    AND p.paramName = '会计核算账套' )
        ) as t_methodId
        cross join
        (
            --查出年份和单位账号,paramInstance需要的    
            select distinct w.belong_unit_code as  belong_unit_code, w.DATA_YEAR as  DATA_YEAR,s.INTERMEDIATEDB_NAME as interMediatedb
            from
                Spagobietl.dbo.TBL_DATACOLLECTION as s,
                Spagobietl.dbo.TBL_ORIGINAL_DATA_REGISTER as w,
                ETL_COLLECTION as c
                where
                s.exec_stat=2
                and
                s.uuid=w.uuid
                and s.INTERMEDIATEDB_NAME is not null
                and s.INTERMEDIATEDB_NAME in (select name from sys.databases) 
    
    
            --and s.id not in (select distinct collid from dbo.ETL_COLLECTION where collid is not null)
        ) as t_unitcodeyear
         cross join
         (
            SELECT distinct unitCode ,accountCode
                 FROM unitCodeAccountCode 
         ) as ucc
        
    
    
         --打开游标   
        OPEN UnitCodeYearMethodIdCursor;
       
        --遍历数据开始
        FETCH NEXT FROM UnitCodeYearMethodIdCursor INTO @methodModelId,@unitCode,@year,@accountCode;
        WHILE @@FETCH_STATUS = 0
        BEGIN
        --插入方法实例
            insert into dbo.autidMethodInstance(
                methodModelID,
                executionState,
                isDeleted
            )
            values(
                @methodModelId,
                'queuing',
                0
            )
            
            SELECT  @methodInstanceId = @@IDENTITY;
            
            --插入批量任务表
            insert into dbo.batchAudit(
                accountCode,
                modelId,
                unitCode,
                year,
                methodInstanceId,
                executionState,
                auditType,
                isEnable,
                addDate
            )
            values(
                @accountCode,
                @methodModelId,
                @unitCode,
                @year,
                @methodInstanceId,
                'queuing',
                'business',
                1,
                CONVERT(VARCHAR,GETDATE(),23)
            )
            
            --添加参数实例
            DECLARE @paramModelId INT;
            DECLARE @paramModelName VARCHAR(100);
            DECLARE paramModelCursor CURSOR
            FOR
                SELECT  paramModelID ,
                        paramName
                FROM    dbo.paramModel
                WHERE   methodID = @methodModelId;
            OPEN paramModelCursor;
            FETCH NEXT FROM paramModelCursor INTO @paramModelId,@paramModelName;
            WHILE @@FETCH_STATUS = 0
                BEGIN
                    IF @paramModelName = '单位编码'
                        BEGIN
                            INSERT  dbo.paramInstance
                                    ( methodInstaceID ,
                                      paramModelID ,
                                      paramValue ,
                                      paramName
                                    )
                            VALUES  ( @methodInstanceId ,
                                      @paramModelId ,
                                      @unitCode ,
                                      '单位编码'
                                    );
                        END;
                    ELSE
                        IF @paramModelName = '预算年度'
                            BEGIN
                                INSERT  dbo.paramInstance
                                        ( methodInstaceID ,
                                          paramModelID ,
                                          paramValue ,
                                          paramName
                                        )
                                VALUES  ( @methodInstanceId ,
                                          @paramModelId ,
                                          @year ,
                                          '预算年度'
                                        );
                            END;
                    FETCH NEXT FROM paramModelCursor INTO @paramModelId,@paramModelName;
                END;
            CLOSE paramModelCursor;
            DEALLOCATE paramModelCursor;
            
     
            FETCH NEXT FROM UnitCodeYearMethodIdCursor INTO @methodModelId,@unitCode,@year,@accountCode;
        END;
        
        
         --关闭游标
        CLOSE UnitCodeYearMethodIdCursor;
        --释放游标
        DEALLOCATE UnitCodeYearMethodIdCursor;
        
        insert into dbo.ETL_COLLECTION(
            COLLID,
            ADDDATE
        )
        select distinct s.id,GETDATE()
        from Spagobietl.dbo.TBL_DATACOLLECTION s,Spagobietl.dbo.TBL_ORIGINAL_DATA_REGISTER w
        where s.status=3
        and s.uuid=w.uuid
        and s.id not in (select distinct collid from dbo.ETL_COLLECTION where collid is not null)
        
        exec('drop table  [dbo].[unitCodeAccountCode]')
    END
     

      

      游标实例:

    USE [wqb_upgrade_test]
    GO
    /****** Object:  StoredProcedure [dbo].[addBusinessBatchExecuteTask]    Script Date: 01/09/2018 21:13:56 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[addBusinessBatchExecuteTask]
      
    AS
        BEGIN
        
        DECLARE @methodModelId int;--方法ID
        DECLARE @unitCode varchar(8000);--单位代码
        DECLARE @year int;--年份
        
        DECLARE @methodInstanceId int;--方法实例ID
        
        DECLARE UnitCodeYearMethodIdCursor CURSOR
        FOR
        select methodModelId,belong_unit_code,DATA_YEAR
        from (
                    SELECT  methodModelID
        FROM    auditMethodModel m
                JOIN auditItem i ON m.itemID = i.itemID
                JOIN dbo.auditCategory c ON c.CategoryID = i.CategoryID
        WHERE   c.isEnable = 1
                AND realTime = 1
                AND ( ( i.isEnable = 1
                        AND m.isEnable = 1
                      )
                      OR ( i.isEnable = 1
                           AND m.isEnable IS NULL
                         )
                      OR ( i.isEnable IS NULL )
                    )
                AND ( m.externalDataSource IS NULL
                      OR LEN(RTRIM(m.externalDataSource)) = 0
                    )
                AND ( m.methodType = 'model'
                      OR m.methodType IS NULL
                    )
                AND ( m.autidType != '人工' )
                AND ( m.isPass = 1 )
    
                
                AND NOT EXISTS ( SELECT TOP 1
                                        1
                                 FROM   paramModel p
                                 WHERE  m.methodModelID = p.methodID
                                        AND p.paramName != '会计核算账套'
                                        AND p.paramName != '预算年度'
                                        AND p.paramName != '单位编码' )
                AND EXISTS ( SELECT TOP 1
                                    1
                             FROM   paramModel p
                             WHERE  m.methodModelID = p.methodID
                                    AND p.paramName = '会计核算账套' )
        ) as t_methodId
        cross join
        (
            --查出年份和单位账号,paramInstance需要的    
            select distinct w.belong_unit_code as  belong_unit_code,w.DATA_YEAR as DATA_YEAR
            from Spagobietl.dbo.TBL_DATACOLLECTION s,Spagobietl.dbo.TBL_ORIGINAL_DATA_REGISTER w
            where s.status=3
            and s.uuid=w.uuid
            --and s.id not in (select distinct collid from dbo.ETL_COLLECTION where collid is not null)
        ) as t_unitcodeyear
        
         --打开游标   
        OPEN UnitCodeYearMethodIdCursor;
       
        --遍历数据开始
        FETCH NEXT FROM UnitCodeYearMethodIdCursor INTO @methodModelId,@unitCode,@year;
        WHILE @@FETCH_STATUS = 0
        BEGIN
        --插入方法实例
            insert into dbo.autidMethodInstance(
                methodModelID,
                executionState,
                isDeleted
            )
            values(
                @methodModelId,
                'queuing',
                0
            )
            
            SELECT  @methodInstanceId = @@IDENTITY;
            
            --插入批量任务表
            insert into dbo.batchAudit(
                modelId,
                unitCode,
                year,
                methodInstanceId,
                executionState,
                auditType,
                isEnable,
                addDate
            )
            values(
                @methodModelId,
                @unitCode,
                @year,
                @methodInstanceId,
                'queuing',
                'business',
                1,
                CONVERT(VARCHAR,GETDATE(),23)
            )
            
            --添加参数实例
            DECLARE @paramModelId INT;
            DECLARE @paramModelName VARCHAR(100);
            DECLARE paramModelCursor CURSOR
            FOR
                SELECT  paramModelID ,
                        paramName
                FROM    dbo.paramModel
                WHERE   methodID = @methodModelId;
            OPEN paramModelCursor;
            FETCH NEXT FROM paramModelCursor INTO @paramModelId,@paramModelName;
            WHILE @@FETCH_STATUS = 0
                BEGIN
                    IF @paramModelName = '单位编码'
                        BEGIN
                            INSERT  dbo.paramInstance
                                    ( methodInstaceID ,
                                      paramModelID ,
                                      paramValue ,
                                      paramName
                                    )
                            VALUES  ( @methodInstanceId ,
                                      @paramModelId ,
                                      @unitCode ,
                                      '单位编码'
                                    );
                        END;
                    ELSE
                        IF @paramModelName = '预算年度'
                            BEGIN
                                INSERT  dbo.paramInstance
                                        ( methodInstaceID ,
                                          paramModelID ,
                                          paramValue ,
                                          paramName
                                        )
                                VALUES  ( @methodInstanceId ,
                                          @paramModelId ,
                                          @year ,
                                          '预算年度'
                                        );
                            END;
                    FETCH NEXT FROM paramModelCursor INTO @paramModelId,@paramModelName;
                END;
            CLOSE paramModelCursor;
            DEALLOCATE paramModelCursor;
            
     
            FETCH NEXT FROM UnitCodeYearMethodIdCursor INTO @methodModelId,@unitCode,@year;
        END;
        
        
         --关闭游标
        CLOSE UnitCodeYearMethodIdCursor;
        --释放游标
        DEALLOCATE UnitCodeYearMethodIdCursor;
        
        insert into dbo.ETL_COLLECTION(
            COLLID,
            ADDDATE
        )
        select distinct s.id,GETDATE()
        from Spagobietl.dbo.TBL_DATACOLLECTION s,Spagobietl.dbo.TBL_ORIGINAL_DATA_REGISTER w
        where s.status=3
        and s.uuid=w.uuid
        and s.id not in (select distinct collid from dbo.ETL_COLLECTION where collid is not null)
        
    END

     11.创建笛卡尔积向某张表插入数据:

      

     insert into [dbo].[TBL_UNIT_FINANCIAL] 
    
     SELECT * FROM ( SELECT UNIT_CODE FROM TBL_UNIT WHERE uk_number IS NOT NULL)B
     CROSS JOIN (
         
    SELECT '财政专户账' AS A,            '专户账' AS Z    UNION
    SELECT '工会账' AS A  ,                '工会账' AS Z     UNION
    SELECT '机关(事业)财务账' AS A  ,    '财务账' AS Z     UNION
    SELECT '基建账' AS A  ,                '基建账' AS Z     UNION
    SELECT '其他' AS A  ,                '其他' AS Z     UNION
    SELECT '系统财务账' AS A,            '系统账' AS Z    
    
     )A

    12.差集(查询A内,不包含B的数据)

      union(联系结果集,自带去重)

    13.java调用存储过程:

            

    14.CASE when ,not  EXISTS

    select distinct t.belong_unit_code,t.belong_unit_name,t.FINANCIAL_DATD_TYPE,
                (
                    case when msg like'%还原失败%' then '还原失败'
                         when msg like'%采集失败%' then '采集失败'
                         when msg like'%服务器信息不完整%' then '服务器信息不完整,无法自动采集'
                         when msg like'%模板匹配失败%' then '模板匹配失败:未匹配到模板'
                         when msg like'%无法解析%' then '无法解析备份类型:通用软件备份'
                         when msg like'%文件服务器上无此文件%' then '文件服务器上无此文件'
                         when msg like'%服务器中断执行%' then '服务器中断执行'
                         when msg like'%压缩文件不合法%' then '压缩文件不合法'
                         when msg like'%上报客户端文件解密出错:解密失败%' then '上报客户端文件解密出错:    解密失败'
                    
                     end
                ) msg
                FROM [dbo].[TBL_ORIGINAL_DATA_REGISTER] t
                WHERE CONVERT(VARCHAR,t.submit_time,23) BETWEEN  @startDate AND @endDate
                AND t.FINANCIAL_DATD_TYPE IS NOT NULL  
                 AND  NOT EXISTS (    
                    SELECT 1 FROM     [dbo]. [TBL_ORIGINAL_DATA_REGISTER]  b 
                    WHERE msg IS NULL AND t.submit_unit_code=b.belong_unit_code 
                    AND CONVERT(VARCHAR,b.submit_time,23) BETWEEN  @startDate AND @endDate
                    AND b.FINANCIAL_DATD_TYPE = t.FINANCIAL_DATD_TYPE
                 )     

     15.游标抓取,修改数据,标准游标

        标准游标:

        DECLARE @cloumn varchar(8000);
        DECLARE @type varchar(8000);
        DECLARE @is varchar(8000);
        DECLARE classCursor CURSOR 
            FOR
                SELECT 字段,类型,是否主键 FROM dbo.班级表            
            OPEN classCursor
            --将查询出来的数据放入声明的变量
             FETCH NEXT FROM classCursor INTO @cloumn,@type,@is;
             WHILE @@FETCH_STATUS = 0
            
             BEGIN
                
                SELECT @cloumn+','
                --取出下一条数据
                FETCH NEXT FROM classCursor INTO @cloumn,@type,@is;
            END
            --关闭游标
            CLOSE classCursor
            --释放游标
            DEALLOCATE classCursor ; 
            

      

        游标抓取,修改数据

        DECLARE @dwszdxzqhdm_code varchar(100);
        DECLARE @dwszdxzqhmc_name varchar(100);
        DECLARE @unit_name varchar(100);
        DECLARE zz CURSOR
        FOR
            SELECT t1.单位所在地行政区划名称 AS dwszdxzqhmc_name,t1.单位所在地行政区划代码 AS dwszdxzqhdm_code,t2.unit_name
                FROM [czcw_gh].[dbo].[基础表_部门决算_单位信息表] t1,[Spagobietl].[dbo].[tbl_unit] t2
                WHERE t1.单位名称 = t2.unit_name
                AND t2.uk_number IS NOT NULL
                AND LEN(t2.uk_serial_number)>0
    
        OPEN zz;
        FETCH NEXT FROM zz INTO @dwszdxzqhdm_code,@dwszdxzqhmc_name,@unit_name;
        WHILE @@FETCH_STATUS = 0
        
        BEGIN
            UPDATE [Spagobietl].[dbo].[tbl_unit]  SET [dwszdxzqhdm_code]=@dwszdxzqhdm_code,[dwszdxzqhmc_name]=@dwszdxzqhmc_name
            WHERE [unit_name]=@unit_name
    
            FETCH NEXT FROM zz INTO @dwszdxzqhdm_code,@dwszdxzqhmc_name,@unit_name;
           END;
        CLOSE zz;
        DEALLOCATE zz;

     16.stuff , replace

    17.多行合并一行:

      select stuff(
        (select n.errorInfo+''
        from(
            SELECT info as errorInfo
            FROM [Spagobietllog].[dbo].[TBL_LOG_DATACOLLECTION] ld
            WHERE BIZID IN(
              SELECT TOP 1 dc.ID
              FROM spagobietl.dbo.TBL_DATACOLLECTION dc
              WHERE dc.UUID = #{errorUUID, jdbcType=VARCHAR} AND dc.EXEC_STAT = 3
              ORDER BY dc.ID
           )
           AND ld.LEVEL = 'ERROR' AND ld.INFO IS NOT NULL AND LEN(ld.INFO)>0
           AND ld.INFO NOT LIKE '%被取消%'
        ) as n for xml path('')),1,1,'') as info

        select id,valuelist=stuff((select ','+value from tb as b where b.ID=a.ID for xml path('')),1,1,'')
        from tb as a
        group by id

        

     SELECT   STUFF(( SELECT  ',' + 字段 FROM dbo.班级表 AS b FOR XML PATH('')), 1, 1, '') valuelist 

     18.开窗,分区函数:

      

      

      

     

    19.创建中间表,创建自增字段:

    --#tableName  中间表   IDENTITY(INT,初始值,增加值)
    select RowNum=IDENTITY(INT,16,6),Name into #T from dbo.Test   
    
    select * from #T  
    
    DROP TABLE #T;  

    20.查询出表结构,游标拼创建表的sql

        DECLARE @cloumn varchar(8000);
        DECLARE @type varchar(8000);
        DECLARE @is varchar(8000);
        DECLARE @allColumn varchar(8000);
        DECLARE @tempColumn varchar(8000);
        DECLARE @tempCore VARCHAR(8000)
        SET @tempCore = ''
        SET @tempColumn =''
        SET @allColumn = 'create table aa('
        DECLARE classCursor CURSOR 
            FOR
                SELECT 字段,类型,是否主键 FROM dbo.班级表            
            OPEN classCursor
            
             FETCH NEXT FROM classCursor INTO @cloumn,@type,@is;
             WHILE @@FETCH_STATUS = 0
            
             BEGIN
               IF(@is='')
                    begin
                         set @tempCore ='primary key'
                    END
                ELSE
                    BEGIN
                        set @tempCore =''
                    end    
                SET  @tempColumn = @tempColumn+@cloumn+' '+@type+' '+@tempCore+','
            
                FETCH NEXT FROM classCursor INTO @cloumn,@type,@is;
            END
        
            CLOSE classCursor
        
            DEALLOCATE classCursor ;
            
             SELECT @allColumn+LEFT(@tempColumn,LEN(@tempColumn)-1)+')'

    21. 获得当前用户和所在用户下的所有表名:

     --获得当前用户和所在用户下的所有表名
      SELECT o2.name 用户名,o.name 表名 
      FROM sys.sysobjects o LEFT JOIN sys.sysusers o2
      ON o.uid = o2.uid
      WHERE o.type = 'U'

    22.UNION联结结果集:(每列的个数必须一样且类型必须相同,UNION去重,UNION ALL不去重)

    SELECT a.年份,SUM(a.[每月数据量大小(byte)])/1024.0/1024 每年数据量总大小,
     max(a.[每月数据量大小(byte)])/1024.0/1024 每月最大数据量,
     min(a.[每月数据量大小(byte)])/1024.0/1024 每月最小数据量,
     avg(a.[每月数据量大小(byte)])/1024.0/1024 平均每月数据量大小
    
    FROM (
        SELECT *, 't1' as  'tname' FROM [郑大二附院住院部].[dbo].[brryxx表$] union all      
        select *, 't2' as  'tname'from   [郑大二附院住院部].[dbo].[yje表$] union all
        select *, 't3' as  'tname'from   [郑大二附院住院部].[dbo].[zyb_cybrjs表$] union all
        select *, 't4' as  'tname' from   [郑大二附院住院部].[dbo].[zyb_sflsz_cybr表$] union all
        
        select *, 't5' as  'tname' from   [郑大二附院门诊部].dbo.mz_tb_brjzxx表$ union all
        select *, 't6' as  'tname' from   郑大二附院门诊部.dbo.mzys_cfjbxx_fy表$ union all
        select *, 't7' as  'tname' from   郑大二附院门诊部.dbo.mzys_cfjbxx_zf表$ union all
        select *, 't8' as  'tname' from   郑大二附院门诊部.dbo.sflsz_mx表$ union all
        
        select *, 't8' as  'tname' from   郑大二附院药事部.dbo.ckd表$ union all
        select *, 't8' as  'tname' from   郑大二附院药事部.dbo.rkd表$ union all
        select *, 't8' as  'tname' from   郑大二附院药事部.dbo.yf_cfjbxx_fy表$ union all
        select *, 't8' as  'tname' from   郑大二附院药事部.dbo.yf_rkd表$ union all
        select *, 't8' as  'tname' from   郑大二附院药事部.dbo.ypcc表$ 
    )A
    group by a.年份

    23.双层游标定义创建sql语句:

    DECLARE @tableName varchar(8000)
    DECLARE createCursor CURSOR
             FOR
                select table_name from INFORMATION_SCHEMA.TABLES       
             OPEN createCursor
             FETCH NEXT FROM createCursor INTO @tableName;
             WHILE @@FETCH_STATUS = 0
             
                 BEGIN
                        DECLARE @str VARCHAR(8000);
                        DECLARE @s Nvarchar(1000)
                        set @s = 'SELECT 字段英文名,数据类型,是否主键 FROM '+@tableName ;
                        --EXEC(@s)
                        
                        set @str = 
                        'DECLARE @cloumn varchar(8000);'+
                        'DECLARE @type varchar(8000);'+
                        'DECLARE @is varchar(8000);'+
                        'DECLARE @allColumn varchar(8000);'+
                        'DECLARE @tempColumn varchar(8000);'+
                        'DECLARE @tempCore VARCHAR(8000);'+
                        'SET @tempCore = '''';'+
                        'SET @tempColumn ='''';'+
                        'SET @allColumn = ''create table '''''+@tableName+'''''('';'+
                        'DECLARE classCursor CURSOR '+ 
                            'FOR '+
                                '('+@s+')' +       
                            'OPEN classCursor '+                        
                             'FETCH NEXT FROM classCursor INTO @cloumn,@type,@is;'+
                            'WHILE @@FETCH_STATUS = 0 '+                        
                             'BEGIN '+
                               'IF(@is='''')'+
                                    'begin '+
                                         'set @tempCore =''primary key auto_increment '';'+
                                    'END '+
                                'ELSE '+
                                    'BEGIN '+
                                        'set @tempCore ='' '';'+
                                    'end '+    
                                'SET  @tempColumn = @tempColumn+@cloumn+'' ''+@type+'' ''+@tempCore+'','''+                        
                                'FETCH NEXT FROM classCursor INTO @cloumn,@type,@is;'+                                
                            'END '+            
                    'CLOSE classCursor;'+          
                    'DEALLOCATE classCursor ;'+
                    'SELECT replace(replace(@allColumn+LEFT(@tempColumn,LEN(@tempColumn)-1)+'')'',''$'',''''),'''''''','''');'
             
            
            exec(@str)
            FETCH NEXT FROM createCursor INTO @tableName;              
            END
        
            CLOSE createCursor;
            DEALLOCATE createCursor ;

    24.sqlserver定时作业

    use master
    GO
    
     
    DECLARE @jobid UNIQUEIDENTIFIER     --作业id
    DECLARE @jobname sysname            --作业名称
    DECLARE @dataBaseNmae VARCHAR(600)  --数据库名称
    DECLARE @savePath VARCHAR(600)      --保存目录
    
    DECLARE @freq_type_config INT       --执行的频率周
    DECLARE @freq_recurrence_factor_config INT   --执行间隔两周
    DECLARE @freq_interval_config INT          --每天执行
    DECLARE @freq_subday_type_config INT       --,重复方式,0x1=在指定的时间,0x4=多少分钟,--重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时执行一次。x1和@active_start_time一起使用,@active_start_time指定开始执行的时间,代表在@freq_type指定的频率间隔内只执行一次--若是x4或x8,只要指定@freq_subday_interval,@freq_subday_interval代表每多少分钟(当@freq_subday_type=0x4)或小时(当@freq_subday_type=0x8)执行的次数
    DECLARE @freq_subday_interval_config INT    --重复周期数,这里每小时执行一次
    DECLARE @active_start_date_config INT   --作业执行的开始日期,为NULL时表示当前日期,格式为YYYYMMDD
    DECLARE @active_end_date_config INT --作业执行的停止日期,默认为,格式为YYYYMMDD
    DECLARE @active_start_time_config INT  --作业执行的开始时间,格式为HHMMSS
    DECLARE @active_end_time_config INT    --作业执行的停止时间,格式为HHMMSS
    
    ------------------------------------------------------------------
    --参数在此配置
    ------------------------------------------------------------------
    SET @jobname = N'testk20:17'     --作业名称,格式:N'作业名称'
    SET @dataBaseNmae = 'test'  --数据库名称
    SET @savePath = 'E:/test/'  --保存目录
        
    set @freq_type_config = 4                --(执行的频率)1:一次,4:每天,8:每周,16:每月,32:每月,相对于frequency_interval,64:在sqlserver 代理服务器启动时运行,128:在计算机空闲时运行
    set @freq_interval_config =1         --(执行的次数)1:一次,4:每天,8:每周
    set @freq_subday_type_config =1        --0x1=在指定的时间,0x4=多少分钟,--重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时执行一次。x1和@active_start_time一起使用,@active_start_time指定开始执行的时间,代表在@freq_type指定的频率间隔内只执行一次                           --若是x4或x8,只要指定@freq_subday_interval,@freq_subday_interval代表每多少分钟(当@freq_subday_type=0x4)或小时(当@freq_subday_type=0x8)执行的次数
    set @freq_recurrence_factor_config = 0  --作业的两次计划执行之间的间隔周或月,仅当frequency_type 设置为、或时,采使用,数据类型为int 默认值为
    SET @freq_subday_interval_config =0     --执行作业的间隔,默认值为
    set @active_start_date_config = 20180410   --作业执行的开始日期,为NULL时表示当前日期,格式为YYYYMMDD
    set @active_end_date_config = 99991231 --作业执行的停止日期,默认为,格式为YYYYMMDD
    set @active_start_time_config = 60000  --作业执行的开始时间,格式为HHMMSS
    set @active_end_time_config = 235959    --作业执行的停止时间,格式为HHMMSS
    
    
    ------------------------------------------------------------------
    --以下均无需改动
    ------------------------------------------------------------------
    
    
    --定义创建作业
    
    
    IF EXISTS(SELECT * FROM msdb.dbo.sysjobs WHERE name=@jobname)
    EXEC msdb.dbo.sp_delete_job @job_name=@jobname
    
    EXEC msdb.dbo.sp_add_job
    @job_name = @jobname,
    @job_id = @jobid OUTPUT
    
    --定义作业步骤
    DECLARE @sql nvarchar(4000),@dbname sysname
    SELECT @dbname=DB_NAME(),  --作业步骤在当前数据库中执行
    @sql=N' DECLARE @date VARCHAR(66)=REPLACE(CONVERT(VARCHAR,GETDATE(),23),''-'','''') 
    DECLARE @tempstr VARCHAR(666)='''+@savePath+@dataBaseNmae+'_''+@date+''.bak''
    
    DECLARE @FILEPATHNAME NVARCHAR(100)
    DECLARE @result int   
    SET @FILEPATHNAME= @tempstr
    CREATE TABLE #T2(a INT,b INT,c INT);
    INSERT INTO #T2 EXEC masteR..XP_FILEEXIST @FILEPATHNAME
    select @result =a from #T2
    drop table #T2
    if(@result=1)
    begin
    EXECUTE master.dbo.xp_delete_file 0,'+N'@tempstr
    end
    
    DECLARE @str VARCHAR(666)=''BACKUP DATABASE '+@dataBaseNmae+' TO DISK='''''+@savePath+@dataBaseNmae+'_''+@date+''.bak''''''
    exec(@str)'  --一般定义的是使用TSQL处理的作业,这里定义要执行的Transact-SQL语句
    EXEC msdb.dbo.sp_add_jobstep
    @job_id = @jobid,
    @step_name = N'步骤一',
    @subsystem = 'TSQL', --步骤的类型,一般为TSQL
    @database_name=@dbname,
    @command = @sql
    
    --创建调度
    EXEC msdb..sp_add_jobschedule
    @job_id = @jobid,
    @name = N'第一个调度',
    @freq_type=@freq_type_config,                
    @freq_interval=@freq_interval_config,           
    @freq_subday_type=@freq_subday_type_config,       
    @freq_subday_interval=@freq_subday_interval_config,     
    @active_start_date = @active_start_date_config,  
    @active_end_date = @active_end_date_config,
    @active_start_time = @active_start_time_config,  
    @active_end_time = @active_end_time_config,   
    @freq_recurrence_factor = @freq_recurrence_factor_config  
    
    
    EXEC msdb.dbo.sp_add_jobserver 
    @job_id = @jobid,
    @server_name = N'(local)' 

    25.查询某个数据库中所有表总行数:

     
      select SUM(rows) allrows from
      (
      select  a.name,b.rows
      from sysobjects as a inner join sysindexes as b on a.id=b.id
      where (a.type = 'u') and (b.indid in (0,1))
     ) as zz

    26.sql行转列:

    27.sql列转行:

    28.拼接还原数据库sql游标:

        DECLARE @name varchar(1000)
        DECLARE @str varchar(1000)
        DECLARE @dwdm varchar(1000)
        
        set @name = '410000_yw_'
        DECLARE My_Cursor CURSOR 
        FOR 
            select dwdm
                from lwsjt.dbo.gx
            
            
        OPEN My_Cursor;
        FETCH NEXT FROM My_Cursor INTO @dwdm
        WHILE @@FETCH_STATUS = 0
            BEGIN
                set @str = 'restore database ['+@name+@dwdm+'] from disk = ''D:Usersz.bak'' with replace,file=1,move ''410000_yw_115201'' to ''D:DataBaseSqlServerSqlServerDataBase'+@name+@dwdm+'.mdf'','
                +'move ''410000_yw_115201_log'' to ''D:DataBaseSqlServerSqlServerLog'+@name+@dwdm+'_log.ldf'''
                
            select @str
                FETCH NEXT FROM My_Cursor INTO @dwdm
                
            END
        CLOSE My_Cursor; 
        DEALLOCATE My_Cursor;
        

    29.还原数据库语句:

    RESTORE DATABASE [henandaxuehuaiheyiyuan506309cwyongyou_20180613100006_5054511020852556869] 
    FROM DISK='F:/lwsj_file/merge_success/orig_name[CWYongYou_20180613],industry[医疗机构],unit[506309],sys_time[1528855218794].bak' 
    WITH REPLACE, 
    FILE=1, 
    MOVE 'CW' TO 'F:DatabasesSqlserverSqlserverDatahenandaxuehuaiheyiyuan506309cwyongyou_20180613100006_5054511020852556869.mdf', 
    MOVE 'CW_log' TO 'F:DatabasesSqlserverSqlserverDatahenandaxuehuaiheyiyuan506309cwyongyou_20180613100006_5054511020852556869_log.ldf'; 

    30.公用表达式递归:

    WITH COL_CTE(Id,Name,ParentId,tLevel )
    AS
    (
        --基本语句
        SELECT Id,Name,ParentId,0 AS tLevel FROM Col
        WHERE ParentId = 0
        UNION ALL
        --递归语句
        SELECT c.Id,c.Name,c.ParentId,ce.tLevel+1 AS tLevel FROM COL as c 
        INNER JOIN COL_CTE AS ce 
        ON c.ParentId = ce.Id
    )
    SELECT * FROM COL_CTE

    31.merge合并:

    create table test1 
    (id int,name varchar(20),dess varchar(20)) 
    go 
    create table test2 
    (id int,name varchar(20),dess varchar(20)) 
    go 
    insert into test1(id,name,dess) 
    values(1,'boyi55','qqq'),(2,'56cto','qwe'),(3,'bbs','asd'),(4,'fengjicai','zxc'),(5,'alis','zxc') 
    insert into test2(id,name,dess) 
    values(1,'boyi','aaa'),(2,'test','qwe'),(3,'test','test')
    
    
    ---------------------------
     
    merge test2 t --要更新的目标表 
    using test1 s --源表 
    on t.id=s.id and t.name = s.name     --更新条件(即主键)
    when matched    --如果匹配,更新 
    then update set t.name=s.name
    when not matched
    then insert values(id,name,dess); --如果两个条件都不匹配,插入。此语句必须以分号结束
  • 相关阅读:
    编译mysql4.0时候出现错误提示checking "LinuxThreads"... "Not found"
    rhel5上使用源代码安装mysql4.0.x
    T400|X220打开AHCI的正确步骤
    MySQL主从同步、读写分离配置步骤
    Icc编译MySQL性能调研
    Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
    hadoop 异常记录 ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times
    创建代理访问.NET WebServices
    国际:2007年最令人失望的九大新兴技术
    黑客惊天发现:苹果能监视iPhone的一举一动
  • 原文地址:https://www.cnblogs.com/kuangzhisen/p/7884541.html
Copyright © 2011-2022 走看看