zoukankan      html  css  js  c++  java
  • sql server 常用函数 【游标】

    转换

    CAST([字段名] as varchar(4000))
    CONVERT(varchar(4000),[字段名])

    1.查询数据库内所有的表

    --查询数据库内的 用户的 表,u表示用户表(就是你自己创建的表),s表示系统表
    select * from sysobjects where xtype='u'

    2.查询数据库内所有表内的所有字段

    --查询表内的所有的列 name:表字段名称 所属表的id xtype:字段的类型用id表示的
    select * from syscolumns

    name:字段名称

    id:所属于表的系统id

    xtype:就是字段的类型ID

    可以通过select * from systypes 查询到所属的类型对应的 是int还是varchar!

    获取一个表内的所有字段,是系统的函数,object_id('表名') 获取到的是表在系统内的id

    select * from syscolumns where id=object_id('部门收文')

     and xtype in (select xtype from systypes where name in ('varchar','nvarchar','char','nchar'))--并且字段的类型你个是 nvarchar,varchar char的

    3.查询系统内支持所有字段的类型

    select * from systypes

    4.函数quotename('表名')

    当表的名字是sql server中的关键字时,需要在将表明 放在尖括号中如: ['index'] index就是一个关键字。
    可以通过函数quotename来解决。

    print('select * from '+quotename('sys_log'))

    输出:select * from [sys_log]

    quotename用法可参考:

    http://blog.163.com/zangyunling@126/blog/static/164624505201132110142270/

    sql server 游标参考:http://www.cnblogs.com/wudiwushen/archive/2010/03/30/1700925.html

    下面存储过程利用游标 以及以上的几个方法 搜索一个数据库内的所有表的固定类型的字段。

    alter procedure Full_Search(@string varchar(100))
    as
    begin
    declare @tbname varchar(100) 
    declare tbroy cursor  for select name from sysobjects  
    where xtype='u' and (name like 'T0%' or name like 'T2%')  --第一个游标遍历以T0,T2开头的所有表
    
    open tbroy
    fetch next from tbroy into @tbname  --填充数据
    while @@fetch_status=0 --假如检索到数据才处理
    begin
      
     declare @colname varchar(100)
     declare colroy cursor for select name from syscolumns
     where id=object_id(@tbname) and xtype in (
     select xtype from systypes
     where name in ('varchar','nvarchar','char','nchar') --数据类型为字符型的字段
     ) --第二个游标是第一个游标的嵌套游标,遍历某个表的所有字段
    
     open colroy
     fetch next from colroy into @colname
     while @@fetch_status=0
     begin
     
     declare @sql nvarchar(4000),@j int
     select @sql='select @i=count(1) from ' +quotename(@tbname) +'  where '+ quotename(@colname)+' like '+'''%'+@string+'%'''
     exec sp_executesql @sql,N'@i int output',@i=@j output   --输出满足条件表的记录数
     if @j>0
     begin
     declare @v varchar(8000)
     set @v='select  distinct * from ' +quotename(@tbname) +'  where '+ quotename(@colname)+' like '+'''%'+@string+'%'''  ---输入满足条件表的信息
     --set @v='select  distinct  ' +quotename(@colname)+' from ' +quotename(@tbname) +'  where '+ quotename(@colname)+' like '+'''%'+@string+'%'''
     exec(@v)
     --print @v 
     end
     fetch next from colroy into @colname
     end       
     
     close colroy  --关闭游标
     deallocate colroy  --释放游标
    
     fetch next from tbroy into @tbname
     end
     close tbroy
     deallocate tbroy
     end
    
    ---------------------用游标 循环 更新Gis记录
    declare @id numeric(18, 0)
    declare @i int
    set @i=0
    declare updateGis cursor for select C0058_ID from T0058_PointObjectGis where c0058_table='C0130_EnerBaseInfo'
    open updateGis --打开游标
    fetch next from updateGis into @id
    while(@@fetch_status=0)
    begin
    update T0058_PointObjectGis set c0058_table='T0130_EnerBaseInfo' where C0058_ID=@id
    set @i=@i+1
    --取下一条记录
    fetch next from updateGis into @id 
    end
    close updateGis
    deallocate updateGis --删除游标
    print('更新记录数------------>'+convert(varchar(50),@i))

     游标实例,循环表内数据,并根据参数 查询其他表内数据,拼接SQL 插入另一个表

    declare @CityStr nvarchar(400)
    declare @Type nvarchar(10)
    declare @sDate datetime --开始时间
    declare @eDate datetime    --结束时间
    declare @CityID nvarchar(10)
    declare @StationID nvarchar(10)
    declare @channel_num nvarchar(10)
    set @CityStr='06'
    set @Type='O3'
    set @sDate='2008-03-01'
    set @eDate='2013-01-20'
    declare C_SlideAvg cursor for select a.id as CityID,b.id as StationId,c.channel_num from TAB_BASE_GROUP as a,TAB_STATION_BASEINFO as b,
    tab_channel_baseinfo as c where a.id=b.group_id and a.id in(@CityStr) and b.id=c.station_id  and upper(c.channel_name)=upper(@Type) 
    and c.channel_state = 1
    open C_SlideAvg --打开游标
    fetch next from C_SlideAvg into @CityID,@StationID,@channel_num
    while(@@fetch_status=0)
    begin
    ------------------------------------------------------------------------------------------------------------------------------
    
    declare @days int --间隔的天数
    declare @i int
    set @i=0
    set @days=datediff(day,@sDate,@eDate)
    declare @mDate datetime
    --开始循环日期相加
    while @i<@days
    begin
        set @i=@i+1
        set @mDate=DATEADD(day,@i,@sDate) --循环的每一天的变量
        declare @h int
        set @h=0
        while @h<24--循环24小时
        begin
            declare @h24 datetime
            set @h=@h+1 --时间每次循环+1
            set @h24=DATEADD(Hour,@h,@mDate)
            declare @oldH datetime
            set @oldH=DATEADD(Hour,-7,@h24) --当前小时数 减去8小时
            declare @sql1 nvarchar(1000)
            --set @sql1='select avg(val) as SlideAvg from S'+@StationID+'HN where channel_num='''+@channel_num+''' and date_time>='+convert(varchar,@oldH,120)+' and date_time<='''+convert(varchar,@h24,120)+''''
            declare @slideAvg real
            set @sql1='select @slideAvg=avg(val) from S'+@StationID+'HN where channel_num='''+@channel_num+''' and date_time>='''+convert(nvarchar,@oldH,120)+''' and date_time<='''+convert(nvarchar,@h24,120)+''''
            --print @sql1
            exec sp_executesql @sql1,N'@slideAvg real output',@slideAvg output
            IF @slideAvg IS NOT NULL AND @slideAvg<>''
            begin
                declare @sql2 nvarchar(1000)
                set @sql2='insert into Tab_Slideavg values(''06'','''+@StationID+''','''+@channel_num+''','''+convert(varchar,@h24,120)+''','''+convert(varchar,@slideAvg,120)+''')'
                exec sp_executesql @sql2
            end
        end
    end
    
    -------------------------------------------------------------------------------------------------------------------------------
    fetch next from C_SlideAvg into @CityID,@StationID,@channel_num --取下一条记录
    end
    close C_SlideAvg--关闭游标
    deallocate C_SlideAvg
    游标
     1 alter procedure p_SlideAvg
     2 (
     3 @CityStr nvarchar(400),--城市字符串
     4 @StationID nvarchar(10),--站点编号
     5 @Type nvarchar(10),--类型
     6 @sDate datetime, --开始时间
     7 @eDate datetime    --结束时间
     8 )
     9 --set @CityStr='06'
    10 --set @Type='O3'
    11 --set @sDate='2008-03-20'
    12 --set @eDate='2008-04-20'
    13 as
    14 declare @CityID nvarchar(10) --城市ID
    15 --declare @StationID nvarchar(10)--站点ID
    16 declare @channel_num nvarchar(10)--类型的channel_num
    17 
    18 --先删除数据
    19 declare @sqlD nvarchar(1000)
    20 set @sqlD='delete from TAB_SlideAvg where stationID='''+@StationID+''' and Date_Time>='''+convert(varchar,@sDate,120)+''' and date_time<='''+convert(varchar,@eDate,120)+''''
    21 exec sp_executesql @sqlD
    22 
    23 declare C_SlideAvg cursor for select a.id as CityID,b.id as StationId,c.channel_num from TAB_BASE_GROUP as a,TAB_STATION_BASEINFO as b,
    24 tab_channel_baseinfo as c where a.id=b.group_id and b.id=c.station_id  
    25 and upper(c.channel_name)=upper(@Type) 
    26 and b.id=@StationID
    27 and c.channel_state = 1
    28 open C_SlideAvg --打开游标
    29 fetch next from C_SlideAvg into @CityID,@StationID,@channel_num
    30 while(@@fetch_status=0)
    31 begin
    32 ------------------------------------------------------------------------------------------------------------------------------
    33 
    34 declare @days int --间隔的天数
    35 declare @i int
    36 set @i=0
    37 set @days=datediff(day,@sDate,@eDate)
    38 declare @mDate datetime
    39 --开始循环日期相加
    40 while @i<@days
    41 begin
    42     set @i=@i+1
    43     set @mDate=DATEADD(day,@i,@sDate) --循环的每一天的变量     print convert(varchar,@mDate,120)
    44     declare @h int
    45     set @h=0
    46     while @h<24--循环24小时
    47     begin
    48         declare @h24 datetime
    49         --set @h24=DATEADD(Hour,@h,@mDate)
    50         set @h24=dateadd(second,59,dateadd(minute,59,dateadd(hour,@h,@mDate)))--时间添加上@h个小时 59分59秒 
    51         declare @oldH datetime
    52         set @oldH=DATEADD(Hour,-7,@h24) --当前小时数 减去7小时
    53         declare @sql1 nvarchar(1000)
    54         declare @slideAvg real
    55         set @sql1='select @slideAvg=avg(val) from S'+@StationID+'HN where channel_num='''+@channel_num+''' and date_time>='''+convert(nvarchar,@oldH,120)+''' and date_time<='''+convert(nvarchar,@h24,120)+''''
    56         exec sp_executesql @sql1,N'@slideAvg real output',@slideAvg output
    57         IF @slideAvg IS NOT NULL AND @slideAvg<>''
    58         begin
    59             declare @sql2 nvarchar(1000)
    60             set @sql2='insert into Tab_Slideavg values('''+@CityID+''','''+@StationID+''','''+@channel_num+''','''+convert(varchar,@h24,120)+''','''+convert(varchar,@slideAvg,120)+''')'
    61             exec sp_executesql @sql2
    62         end
    63         set @h=@h+1 --时间每次循环+1
    64     end
    65 end
    66 
    67 -------------------------------------------------------------------------------------------------------------------------------
    68 fetch next from C_SlideAvg into @CityID,@StationID,@channel_num --取下一条记录
    69 end
    70 close C_SlideAvg--关闭游标
    71 deallocate C_SlideAvg--销毁游标
  • 相关阅读:
    oarcle 提取数字函数
    通用XML操作类(微型本地xml数据库)
    linux内核模块Makefile的解析
    开源的许可证GPL、LGPL、BSD、Apache 2.0的通俗解释
    弹性布局
    CSS基础知识
    HTML5基本标签
    VS2008开发Windows Mobile6环境搭建及模拟器联网问题图解
    .Silverlight Binding (One Time,One Way,Two Way)
    WCF Service中HttpContext.Current为null的解决办法
  • 原文地址:https://www.cnblogs.com/wangjunwei/p/2598685.html
Copyright © 2011-2022 走看看