• 游标、获取本地本地多个文件、Excel数据导入、跨服务器数据拷贝、行转列示例


    declare @dirPath varchar(200)='C:UsersAdministratorDesktop待处理数据顺江学校4'
    
    --------------------------------------------------------------------------------------------获取本地文件夹下多个文件----------------------------------------------------------
    if(OBJECT_ID('ff')>0)
        drop table ff
    
    
    create table ff
    (
        id int identity(1,1),
        fName varchar(300),
        depth int,
        isFile int
    )
    
    insert into ff
    exec xp_dirtree @dirPath, 0, 1
    
    --select * from ff
    
    if(OBJECT_ID('RawScore')>0)
        drop table RawScore
        
    CREATE TABLE [dbo].[RawScore](
        [F] [varchar](50) NULL,
        [F0] [varchar](50) NULL,
        [F1] [nvarchar](255) NULL,
        [F2] [nvarchar](255) NULL,
        [F3] [float] NULL,
        [F4] [float] NULL,
        [F5] [float] NULL,
        [F6] [nvarchar](255) NULL,
        [F7] [float] NULL,
        [F8] [float] NULL,
        [F9] [float] NULL
    )
    
    declare @studentId varchar(50)='',@studentName varchar(50)='',@studentInfo varchar(100)='';
    declare @pos int=0,@len int =0;
    declare @fileName varchar(100);
    declare @sql varchar(max) = '';
    
    ------------------------------------------------------------------游标操作-----------------------------------------------------------------------------
    declare cur cursor for
    select fName from ff
    
    open cur
    fetch next from cur into @fileName
    
    while @@FETCH_STATUS=0
    begin
    
        set @studentInfo=SUBSTRING(@fileName,1,patindex('%.xls',@fileName)-1)
        set @pos = PATINDEX('%[_]%',@studentInfo);
        set @len = LEN(@studentInfo);
        set @studentName = SUBSTRING(@studentInfo,1,@pos-1);
        set @studentId = SUBSTRING(@studentInfo,@pos+1,@len);
        --select @studentName,@studentId
    
    --------------------------------------------------------------------------------------导入本地Excel文件数据---------------------------------------------------------------------------
        set @sql = 'insert into RawScore
        select '''+@studentId+''','''+@studentName+''',* from OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0;Database='+@dirPath+@fileName+''', [Sheet1$])';
        exec(@sql)
        
        fetch next from cur into @fileName
        
    end
    
    close cur
    deallocate cur
    
    if(OBJECT_ID('StudentScore')>0)
        drop table StudentScore
        
    CREATE TABLE [dbo].[StudentScore](
        [Id] [uniqueidentifier] NOT NULL,
        [StudentID] [varchar](50) NULL,
        [Name] [varchar](50) NULL,
        [Kind] [int] NULL,
        [ItemName] [varchar](50) NULL,
        [Score] [float] NULL
    )
    
    insert into studentScore
    select NEWID(), f,F0,1,F2,f5 from RawScore where f2!='内容板块(满分)' and PATINDEX('%[(]%',F2)>0
    union all
    select NEWID(), f,F0,2,F6,f9 from RawScore where f6!='能力层次(满分)' and PATINDEX('%[(]%',F6)>0
    
    select * from StudentScore order by name
    
    -------------------------------------------------------跨服务器链接数据库进行数据操作-------------------------------------------------
    --declare @count int=0
        
    --select @count=COUNT(*) from sys.servers where name='syncDBLink'
    --if(@count > 0)
    --begin
    --    exec sp_dropserver 'syncDBLink','droplogins'
    --end
    
    ----打开指定服务器上的数据库
    --exec sp_addlinkedserver 'syncDBLink','','SQLOLEDB','192.168.0.102','','','wangyue0428';
    --exec sp_addlinkedsrvlogin 'syncDBLink',false,null,'sa','HX1q2w3e4r';
    --exec sp_serveroption 'syncDBLink','rpc out','true';
    
    
    --delete from  syncDBLink.wangyue0428.dbo.StudentScore
    
    --insert into syncDBLink.wangyue0428.dbo.StudentScore
    --select * from StudentScore
    
    --exec sp_dropserver 'syncDBLink','droplogins'
    
    
    --select StudentID,Name,Kind,SUM(Score) from StudentScore
    --group by StudentID,Name,Kind
    
    --select distinct studentId,name from StudentScore
    
    -----------------------------------------------------------------------------------行转列实现-------------------------------------------------------------------
    ;with cte1 as
    (
        select StudentID,Name, [拼音练习(8.00)],[字词练习(16.00)],[句子练习(21.00)],[课内文段阅读(12.00)],[课外文段阅读(18.00)],[习作(25.00)]
        ,[拼音练习(8.00)]+[字词练习(16.00)]+[句子练习(21.00)]+[课内文段阅读(12.00)]+[课外文段阅读(18.00)]+[习作(25.00)] as 小计
        from 
        (
            select StudentID,Name,ItemName,Score from syncDBLink.wangyue0428.dbo.StudentScore where Kind=1
        ) as s
        pivot
        (
            sum(Score)
            for ItemName in([拼音练习(8.00)],[字词练习(16.00)],[句子练习(21.00)],[课内文段阅读(12.00)],[课外文段阅读(18.00)],[习作(25.00)])
        ) as pv
    )
    ,cte2
    as
    (
        select StudentID,Name, [识记(18.00)],[表达应用(51.00)],[理解(16.00)],[分析综合(15.00)]
        ,[识记(18.00)]+[表达应用(51.00)]+[理解(16.00)]+[分析综合(15.00)] as 小计
        from 
        (
            select StudentID,Name,ItemName,Score from syncDBLink.wangyue0428.dbo.StudentScore where Kind=2
        ) as s
        pivot
        (
            sum(Score)
            for ItemName in([识记(18.00)],[表达应用(51.00)],[理解(16.00)],[分析综合(15.00)])
        ) as pv
    )
    select ROW_NUMBER() over(order by cte1.小计 desc) as 序号, '顺江中学' as 学校名称,cte1.Name as 姓名,'' as 性别,[拼音练习(8.00)],[字词练习(16.00)],[句子练习(21.00)],[课内文段阅读(12.00)],[课外文段阅读(18.00)],[习作(25.00)],cte1.小计
    ,[识记(18.00)],[表达应用(51.00)],[理解(16.00)],[分析综合(15.00)],cte2.小计
    from cte1
    inner join cte2 on cte1.StudentID=cte2.StudentID
  • 相关阅读:
    mysql 索引学习笔记
    mysql mysqli pdo学习总结
    Flask-Login的实现
    Flask配置方法
    Flask-SQLAlchemy使用方法
    alpha阶段绩效考核
    Alpha版本后的心得体会
    代码及数据库展示
    功能简介
    最新的用户需求分析
  • 原文地址:https://www.cnblogs.com/AndyGe/p/3394078.html
Copyright © 2020-2023  润新知