• SQLServer技巧


    -2.批量更新:

    UPDATE p_ProductTab SET PC4=p.pc4
    from (select productid='030301102000',pc4='423523' union all
    select productid='030301102001',pc4='sdgser'
    ) as p
    WHERE p_ProductTab.productid=p.productid

    -1.保留2位小数

     Convert(decimal(18,2),字段)  长度为18位,2位小数

    0.null的判断

    case when 字段名 is null then ** else ** end

    将null替换为0:  isnull(字段名,0)

    1.搜索替换某个字段里的字符串

    方法一:varchar和nvarchar类型是支持replace,所以如果你的text不超过8000可以先转换成前面两种类型再使用replace 替换 text ntext 数据类型字段的语句 。

    update 表名 set 字段名=replace(cast(与前面一样的字段名 as varchar(8000)) ,'原本内容','想要替换成什么')

    方法二:update [表名] set 字段名 = replace(与前面一样的字段名,'原本内容','想要替换成什么')

    例子:UPDATE p_ProductTab SET Spec=replace(Spec,',',',') where spec like N'%,%' COLLATE Chinese_PRC_CI_AS_WS

    COLLATE Chinese_PRC_CI_AS_WS 全角和半角的指定

    2.截取某个字段中的值

    select substring(prlstr4,patindex('%合同号%',prlstr4)+4,6) as PO,substring(prlstr4,patindex('%客户料号%',prlstr4)+5,7) as PN,substring(prlstr4,patindex('%REV%',prlstr4)+4,3) as REV,substring(prlstr4,patindex('%其他要求%',prlstr4)+5,1000) as other
    from (select top 5000 prlstr4 from OA_OrderBillDetailOriginalTab with(nolock) order by Id desc) b
    where prlstr4 like '%1245991%'

    3.获取自增长ID

    select scope_identity()

    4.初始化自增长ID,删除所有数据

    truncate table tbname

    5 .多条插入

    INSERT INTO fp_TiaoXianSpec
    select '1277661','ASY,ATTACHED ROUND CABLE,SMF,MPO-MPO,STD FERRULE,1m' union all
    select '1277662','ASY,ATTACHED ROUND CABLE,SMF,MPO-MPO,STD FERRULE,2m' union all
    select '1277663','ASY,ATTACHED ROUND CABLE,SMF,MPO-MPO,STD FERRULE,3m'

    用于插入excel数据时,先在excel中处理字符串,然后copy到SQL查询器中

    excel中连接字符串公式  =CONCATENATE("select ",A101,",'0",B101,"','",C101,"','','' union all")

    数字转换成字符串公式 =TEXT(A6,"####")

    还可以利用select 生成临时表:

    join (select product='030301101660',amount=100 union all
    select product='030301101561',amount=200 union all
    select product='030301101462',amount=300 union all
    select product='030301101363',amount=400)

    6.获取系统时间getdate(),还可以进行计算getdate()-1等,后面的单位为天

    7.生成数据字典

    use fpErp  --指定要生成数据字典的数据库

    go 

    SELECT 

    表名=case when a.colorder=1 then d.name else '' end,

    表说明=case when a.colorder=1 then isnull(f.value,'') else '' end,

    字段序号=a.colorder,

    字段名=a.name,

    标识=case when COLUMNPROPERTY(a.id,a.name,'IsIdentity')=1 then '√'else '' end,

    主键=case when exists(SELECT 1 FROM sysobjects where xtype='PK' and name in (

      SELECT name FROM sysindexes WHERE indid in(

       SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid

       ))) then '√' else '' end,

    类型=b.name,

    占用字节数=a.length,

    长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),

    小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),

    允许空=case when a.isnullable=1 then '√'else '' end,

    默认值=isnull(e.text,''),

    字段说明=isnull(g.[value],'')

    FROM syscolumns a

    left join systypes b on a.xtype=b.xusertype

    inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'

    left join syscomments e on a.cdefault=e.id

    left join sys.extended_properties g on a.id=g.major_id and a.colid=g.minor_id

    left join sys.extended_properties f on d.id=f.major_id and f.minor_id =0

    --where d.name='要查询的表' --如果只查询指定表,加上此条件 

    order by a.id,a.colorder

    8.字符串截取与搜索特定字符位置

    select id,fileNo,fileName,transdept,transdetail,transdone,returndetail,returndone,opdate,skfileid,fileid from fp_filehistory
    where filemedia='1' and transdone='1' and CONVERT(datetime,SUBSTRING(transdetail,5,charindex(' ',transdetail)-5)) between getdate()-1 and getdate()

    9.行列转换例子:

    student course grade
    --------- ---------- --------
    student1 语文 50
    student1 数学 60
    student1 英语 40
    student2 语文 30
    student2 数学 40
    student2 英语 50

    select student,
    max(case course when '语文' then grade else 0 end) as "语文",
    max(case course when '数学' then grade else 0 end) as "数学",
    max(case course when '英语' then grade else 0 end) as "英语"
    from fp_colrol
    group by student

    结果

    student1 82 65 75
    student2 74 96 0

    9.将表数据分组并合并列为一行:

    select aa.*,bb.projmem from fp_projma aa
    left join (select a.projno, STUFF(( SELECT ';' + projmem
    FROM fp_projmem b
    WHERE a.projno = b.projno
    FOR XML PATH('')), 1, 1, '') AS projmem
    FROM fp_projmem a GROUP BY a.projno) bb on bb.projno=aa.projno

    例子:

    --测试数据
    if not object_id(N'Tempdb..#T') is null
    drop table #T
    Go
    Create table #T([nameid] nvarchar(24),[subject] nvarchar(22),[passy] nvarchar(21))
    Insert #T
    select N'A001',N'语文',N'Y' union all
    select N'A001',N'数学',N'N' union all
    select N'A002',N'语文',N'N' union all
    select N'A002',N'英语',N'Y'
    Go
    --测试数据结束
    SELECT a.nameid ,
    STUFF(( SELECT ';' + [subject] + [passy]
    FROM #T b
    WHERE a.[nameid] = b.[nameid]
    FOR
    XML PATH('')
    ), 1, 1, '') AS type
    FROM #T a
    GROUP BY a.nameid

  • 相关阅读:
    测网速
    fseek 在以字符串模式打开的文件中工作不正常 [MSDN]
    Inno Setup: Ask for reboot after uninstall
    【Inno Setup】Pascal 脚本 ---- 事件函数
    在安装程序之前,预先安装别的程序
    【Inno Setup】查看是否安装了VC++ 2015 Redistributeable
    spark学习笔记
    docker学习笔记2
    kafka读书笔记《kafka权威指南》2018
    mongodb
  • 原文地址:https://www.cnblogs.com/yc-shen/p/8072896.html
Copyright © 2020-2023  润新知