zoukankan      html  css  js  c++  java
  • sql 2008常用语法语句收集

    EXEC sp_dropuser 'test'   : 从当前数据库删除用户 test
    EXEC sp_droplogin 'test'  : 从 SQL Server 中删除登录 test
    select @@servername    :查看本机sql 2008实例名
    set quoted_identifier off  :关闭双引号识别
    sp_who :查询当前使用用户,进程
    sp_helptext 函数或者触发器或者存储过程名   :查看代码
    sp_helpindex 'table' 查看索引
    kill 进程号
    dbcc showcontig('u_table') --检查表碎片
    DBCC DBREINDEX ('u_table','',90)   --优化表重建索引
    
    sp_spaceused  :查看当前数据库大小
    dbcc checkdb 检查数据库是否有错,是否损坏  
    select serverproperty('productlevel')  --检查是否打了SP4补丁,如果没有打过SP4,则为RTM,否则显示的是SP4版本。
    select DATABASEPROPERTYEX('master','version') --查看当前SQL版本号
    
    
    建表前的判断语句:
    if object_id('a') is not null drop table a
    create table a(times datetime)
    select * from sysobjects  --系统对象表
    xtype: u表;v视图; p:过程 fn:函数 tr:触发器
    select * from sysindexes –查看索引
    select * from syscolumns  --系统字段表
    select * from syscolumns  where object_id('u_ware_q')=id
    select * from syscolumns where object_name(id) = 'u_ware_q'
    select object_name(id),* from syscolumns where object_name(id)='u_ware_p' --根据某个字段查出是哪个表
     select * from sysobjects a, syscolumns b where a.id=b.id and b.name = 'maxunit' --查看使用某字段的所有表
    select * from syscomments    --函数,触发器等的代码
    例:查所有触发器 存储过程有发短信的代码
    select object_name(id) from syscomments where text like '%短信'
    select * from syscolumns where id=object_id('u_ware_q')
    select system_user  --当前操作系统用户
    select user --当前数据库登录用户
    SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE TABLE_NAME='u_ware_q' --查看表的主键
    sp_helptext p_物流发送后发短信   --显示所有封装后的代码
      用SQL语句查找包含有某个关键字的存储过程、触发器、函数等等,SQL语句如下:
    select OBJECT_NAME(id) as 存储过程,id from syscomments 
    where id in (select   object_id(name)   from dbo.sysobjects   where type='P'  --存储过程为P)
    and text like '%FieldName%'  --关键字
    group by id 
    
    --查表依赖关系
    select a.* from sysobjects a, syscomments b where a.id =b.id and b.text like '%u_store_i%'
    --断开所有链接
    DECLARE @sql VARCHAR(4000)
    SET @sql= ''
    SELECT @sql = @sql + ' kill  ' + CAST(spid AS VARCHAR) + CHAR(13)
    FROM master.sys.sysprocesses WHERE dbid = db_id( 'CMDK_DEV')
    EXEC(@sql)
      
    EXEC sp_executesql @sql
    
    xtype:对象类型。可以是下列对象类型中的一种: 
    C = CHECK 约束
    D = 默认值或 DEFAULT 约束
    F = FOREIGN KEY 约束
    L = 日志
    FN = 标量函数
    IF = 内嵌表函数
    P = 存储过程
    PK = PRIMARY KEY 约束(类型是 K)
    RF = 复制筛选存储过程
    S = 系统表
    TF = 表函数
    TR = 触发器
    U = 用户表
    UQ = UNIQUE 约束(类型是 K)
    V = 视图
    X = 扩展存储过程
    
    --常用函数
    select len('我是中国人')  --取字符串
    select datalength('我是中国人sddsfs')  --取长字符串长度
    select dbo.f_left('我是中国人sdflskfsjkl',6)    --取字符串:我是中 只在海典系统中使用
    select left('我是中国人sdfksfls',6) --取字符串:我是中国人a,汉字作为一个字符
    select replace('我是中国人lkklkl','','asdd')  --替换
    select REPLACE (' 处方信' ,' ','')  --去掉字符串中所有空格
    select rtrim('我是中国人  ')  --去掉右空格
    select ltrim('   我是中国人')  --去掉左空格
    select right('test-tsss',charindex('-','test-tsss')-1) --取'-'第一次开始的右边所有字符
    select isnumeric('222ss--2sdsd')  -- select isnumeric('s222s') --当输入表达式得数为一个有效的整数、浮点数、money 或decimal 类型,那么ISNUMERIC 返回;否则返回。返回值为确保可以将expression 转换为上述数字类型中的一种。但是此函数存在Bug,就是'234a2342'同样会认为是数字类型可以替代的写法是
    select PATINDEX('%[^0-9]%', '234122')  --等于0为纯数字--如果返回值大于0,则有非数字字符。
    --对于支持小数点和正负数写法是
    select PATINDEX('%[^0~9|.|-|+]%','22.22')
    select patindex('%[吖-座]%','2221在sss') --有中文返回5
    select patindex('%[d]%','rcrdsddddaadadffdr')
    --返回,[]中d在字符串rcrdsddddaadadffdr的第一次出现的位置。
    select patindex('%[cd]%','rcrdsdddrdaadadffdr')
    --返回,[]中c,d在其中一个的位置,返回最先出现的这个位置,c在此字符串里第一次出现位置是,而d是,结果取最先的那个。
    select patindex('%[sd]%','rcrdsdddrdaadadffdr')
    --返回,[]中c,d在其中一个的位置,返回最先出现的这个位置,s在此字符串里第一次出现位置是,而d是,结果取最先的那个。
    select patindex('%[^r]%','rrrdsdddrdaadadffdr')
    --返回,除[]中的字符串的匹配字符,第一次出现d不在[^r]里,所以就找到第一次这位。
    select patindex('%[^rd]%','rrrdsdddrdaadadffdr')
    --返回,除[]中的字符串的匹配字符,第一次出现s不在[^rd]里,所以就找到第一次这位。
    select patindex('%[^rsd]%','rrrdsdddrdaadadffdr')
    --返回,除[]中的字符串的匹配字符,第一次出现a不在[^rsd]里,所以就找到第一次这位。
    max()  --取最大值min()  --取最小值sum()  --求和count() --统计记录数
    select accdate,sum(realamt),max(realamt),min(realamt),count(realamt)
    from r_sale
    where accdate>'2011-01-15 00:00:00.000' and accdate < '2011-01-25 00:00:00.000'
    group by accdate
    having sum(realamt) > 60000
    字符截取:left()、right()、substring()、charindex()
    select SUBSTRING(warename,1,4) from u_ware   --取字符串,从第1个字符开始至第4个结束
    select SUBSTRING(CONVERT(text,'在s在在夺要'),1,5) --截取中英混合的字符串(中文和字母)
    select 5000/10000.0 --想变成.5
    select 5500/10000.0 --想变成.55
    select 5550/10000.0 --想变成.555
    select 5555/10000.0 --想变成.5555
    其结果分别为:0.5000000    0.5500000  0.5550000   0.5555000
    select 15%4 结果为 判断是否整除,是否整数倍
    select 15%5 结果为
    一、如果想去掉数字后面多余的 ,需要转化一下:
    --取随机数
     select  ceiling(10 * rand())
     select rand()
    select ceiling(RAND()*(60-20)+20) --随机生成20-60之间的一个整数
    select CONVERT(FLOAT,5000/10000.0) --想变成.5
    select CONVERT(FLOAT,5500/10000.0) --想变成.55
    select CONVERT(FLOAT,5550/10000.0) --想变成.555
    select CONVERT(FLOAT,5555/10000.0) --想变成.5555
    
    其结果分别为: 0.5  0.55  0.555 0.5555
    --Sql截取浮点小数位数,不四舍五入
    round(551.239567,2,0)
    结果:551.24
    
    round(551.239567,2,1)
    结果:551.23
    
    --第一个表示截取位
    --第二个,1分别表示是四舍五入,0以外是截取
    select cast(19.001 as int) --数字型取整数部分
    select 19.001 - cast(19.001 as int) --数字型取小数部分
    select distinct wareid from u_store_m  --过滤重复记录 唯一
    select space(10)   --返回个空格字符串
    --两个数据集连接
    select wareid from u_accept_c
    union all  
    select wareid from u_store_m where symqty>1000
    --存在于某个数据集值in 、not in
    select * from u_ware_q where wareid in('2339','12233')
    select * from u_ware_q where wareid not in(select wareid from u_ware_class where classcode ='01010')
    --存在于某个数据集exists 、not exists ,尽量用这个优化数据集查询速度,可用在多表操作
    select * from u_ware_q a where exists(select 1 from u_sale_c b where a.wareid = b.wareid)  --查询没有销售记录的商品
    
    --查看表约束
    sp_helpconstraint  d_ware_print
    --修改 删除主键
    alter table 表名 drop constraint 约束名/主键名
    
    --给字段默认值
    ALTER TABLE [dbo].[u_ware_q] ADD  DEFAULT (0) FOR [pile]
    
    if col_length('c_dyscript','projectid') is null
       alter table c_dyscript add projectid int default 0
    go
    update c_dyscript set projectid = 0 where projectid is null
    go
    if exists(select * from syscolumns where id = object_id('c_dyscript') and name = 'projectid' and isnullable = 1)
       alter table c_dyscript alter column projectid int not null
    go
    declare @sql_20140317 nvarchar(1000)
    select @sql_20140317 = 'alter table c_dyscript drop constraint [' + name + ']' from sysobjects where parent_obj = object_id('c_dyscript') and xtype = 'pk'
    exec(@sql_20140317)
    go
    alter table c_dyscript add primary key(winname,projectid,control,event)
    go
    
    select floor(11.23)  --返回小于或等于所给数字表达式的最大整数。向下取整
    select ceiling(11.23)  --向上取整数四舍五入
    select round(11.23334,2)  --取两位小数
    select abs(112.22),abs(-112.33)  --取绝对值
    select max(stamp)+0 from d_ecs_order_info
    select convert(int max(stamp)) from d_ecs_order_info  显式转换
    cast((c.supply_qty+0.0)/isnull(a.supply_sumqty,1) as numeric(16,4)) –两个整数相除得行小数的方法   
    
    isnull(可能为空字段,'')   : sql判断是否为空的写法,如果字段为空的话,就赋''给某个字段。
    IDENTITY(int,1,1)   :在表中插入递增数
    Case 用法:以计算毛利为例:
    select case when saleprice =0 then 0 else (saleprice -purprice)/ saleprice end as 毛利率
    from u_sale_c
    where 条件….
    
    select LTRIM(RTRIM(str(商品编码)+'1')),商品名称,商品规格
    ,case when isnull(生产企业,'')='' then '' else 生产企业 end
    from 商品资料测试
    时间字段转换
    select CONVERT(varchar(12),execdate,23)from u_distapply_m where CONVERT(varchar(12),execdate,23)='2014-05-06' --取时间字段中的日期
    CONVERT(varchar(25),dateadd(day,-2,execdate),21 )  --取日期的前两天
    datediff(dd,r_sale.accdate,dateadd(mm,1,r_sale.accdate)) –计算当月天数
    select datediff(dd,'2016-01-01',getdate()) --从某天至现在的天数
    SELECT CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
     SELECT CONVERT(varchar(100), GETDATE(), 1): 05/16/06
     SELECT CONVERT(varchar(100), GETDATE(), 2): 06.05.16
     SELECT CONVERT(varchar(100), GETDATE(), 3): 16/05/06
     SELECT CONVERT(varchar(100), GETDATE(), 4): 16.05.06
     SELECT CONVERT(varchar(100), GETDATE(), 5): 16-05-06
     SELECT CONVERT(varchar(100), GETDATE(), 6): 16 05 06
     SELECT CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
     SELECT CONVERT(varchar(100), GETDATE(), 8): 10:57:46
     SELECT CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
     SELECT CONVERT(varchar(100), GETDATE(), 10): 05-16-06
     SELECT CONVERT(varchar(100), GETDATE(), 11): 06/05/16
     SELECT CONVERT(varchar(100), GETDATE(), 12): 060516
     SELECT CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
     SELECT CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
     SELECT CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
     SELECT CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
     SELECT CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
     SELECT CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
     SELECT CONVERT(varchar(100), GETDATE(), 24): 10:57:47
     SELECT CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
     SELECT CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
     SELECT CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
     SELECT CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
     SELECT CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
     SELECT CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
     SELECT CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
     SELECT CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
     SELECT CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
     SELECT CONVERT(varchar(100), GETDATE(), 108): 10:57:49
     SELECT CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
     SELECT CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
     SELECT CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
     SELECT CONVERT(varchar(100), GETDATE(), 112): 20060516
     SELECT CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
     SELECT CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
     SELECT CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
     SELECT CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49:000
    select CONVERT(datetime,'2015-06-04 10:46:21', 20)  字符转换为日期
    select   dateadd(dd,-day(dateadd(month,-1,getdate()))+1,dateadd(month,-1,getdate()))/*上个月一号*/  
    select   dateadd(dd,-day(getdate()),getdate()) /* 上月月底*/  
    select   dateadd(dd,-day(getdate())+1,getdate())  /* 本月一号*/  
    select   dateadd(dd,-day(dateadd(month,1,getdate())),dateadd(month,1,getdate()))/* 本月底*/  
    select   dateadd(dd,-day(dateadd(month,1,getdate()))+1,dateadd(month,1,getdate()))        /* 下月一号*/  
    select   dateadd(dd,-day(dateadd(month,2,getdate())),dateadd(month,2,getdate()))            /* 下月月底*/  
    select dateadd(month,-1,getdate()) --取前一个月/上一个月
    
    ,case when DATEPART(weekday,accdate1)=7 then '星期六'  --计算星期几
           when DATEPART(weekday,accdate1)=1 then '星期天'
          else '' end as '备注'
    select * from u_dist_m where  DATEDIFF(DAY,createtime,GETDATE())<=15
    --取最近15天的记录
    --取前推7天的请货数,从昨天开始计算
    select a.execdate
    from u_distapply_m a,u_distapply_c b
    where a.applyno=b.applyno and status=1
    and convert(varchar(10),a.execdate,23) 
    between convert(varchar(10),dateadd(day,-7,GETDATE()),23)
    and convert(varchar(10),dateadd(day,-1,GETDATE()),23)
    
    select * from u_distapply_m a where  --按时间段查询数据,在存储过程动态报表中常用
    a.execdate between '2017-10-12' and dateadd(ms,-3,dateadd(dd,1,'2017-10-13'))
    
    select @day = DATEPART(dd,getdate()) --取日期号数                             
    --逢会员日,打折,不积分             
    if  @day in(8,18,28)
    select   filename   from   master.dbo.sysdatabases   where   name   =   '数据库名' --查看数据库文件存放位置
    DATEDIFF(dd,CONVERT(varchar(12),createtime,23),getdate())>=7 --大于当前日期天含天的日记录
    select stamp+0 from u_dist_m where distno='单号' --取时间戳
    select wareid,stamp+0,DATEADD(second,stamp+0+ 8 * 3600,'2013-01-01 00:00:00') from u_ware_q where wareid='110160' –时间戳转日期
    select a.wareid,b.warename from hydee_2004..u_ware_q a,hydee_连锁..u_ware_q b where a.wareid=b.wareid  --取不同数据库的表数据
    
    sql中,两个比较函数用法:都可生成排序用1、ROW_NUMBER() over(order by wareid)
    2IDENTITY(bigint)
    
    --OPENQUERY 的用法:
    OPENQUERY (linked_server, "INSERT INTO msgs(...) VALUES(...)");以上做法是不正确的,
    正确做法如下:
    SELECT 示例:SELECT * FROM OPENQUERY (linked_server, "SELECT * FROM msgs");
    INSERT 示例:INSERT OPENQUERY ([192.168.0.200], 'SELECT title, content FROM msgs') VALUES ('title', 'content');
    UPDATE 示例:UPDATE OPENQUERY ([192.168.0.200], 'SELECT title, content FROM msgs WHERE id=1') SET title = 'newTitle',content = 'newContent';
    DELETE 示例:DELETE OPENQUERY ([192.168.0.200], 'SELECT id FROM msgs WHERE id=1');
    --跨服务器更新数据
    set quoted_identifier off
    go
    declare @warename varchar(20)
    set @warename='测试商品名'
    UPDATE OPENQUERY ([192.168.0.200], "select warename from hydee_fst..d_ware0209 where wareid='100000'") SET warename=@warename;
    
    注意OPENQUERY 不接受参数变量,也就是说:DELETE OPENQUERY ([192.168.0.200], 'SELECT id FROM msgs WHERE id=' + @id); 
    是不正确的,但可以这样做:DELETE OPENQUERY ([192.168.0.200], 'SELECT id FROM msgs') WHERE id=@id); 。
    T-SQL 中,INSERT 可以省略 INTODELETE 也可以省略 FROMINSERT 时必须明确 SELECT 的字段。
  • 相关阅读:
    mysql修改数据表名
    HDU 5742 It's All In The Mind (贪心)
    HDU 5752 Sqrt Bo (数论)
    HDU 5753 Permutation Bo (推导 or 打表找规律)
    HDU 5762 Teacher Bo (暴力)
    HDU 5754 Life Winner Bo (博弈)
    CodeForces 455C Civilization (并查集+树的直径)
    CodeForces 455B A Lot of Games (博弈论)
    CodeForces 455A Boredom (DP)
    HDU 4861 Couple doubi (数论 or 打表找规律)
  • 原文地址:https://www.cnblogs.com/binghou/p/9102302.html
Copyright © 2011-2022 走看看