资讯专栏INFORMATION COLUMN

sql server(常用)

DevYK / 2260人阅读

摘要:如果或为负,则返回空字符串。当对数据库进行复杂操作时如对多个表进行时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。可移植性差由于存储过程将应用程序绑定到,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。

普通用法
//生成 uuid 并转为小写
select LOWER(SUBSTRING(uuid,1,8)+"-"+SUBSTRING(uuid,10,4)+"-"+SUBSTRING(uuid,15,4)+"-"+SUBSTRING(uuid,20,4)+"-"+SUBSTRING(uuid,25,12)) 
from (select cast(NEWID() as varchar(36)) as uuid) s  //ea52a7bb-a2aa-44b8-be28-5ebc64defcf9

//获取时分秒
select DateName(hour,GetDate())+ DateName(minute,GetDate())+DateName(second,GetDate()) //143054

//1000-9999随机数
select floor(9000*RAND()+1000)

//日期格式化
select GETDATE()                            //2019-02-12 14:30:16.763
Select CONVERT(varchar(100), GETDATE(), 8)  //10:57:46
Select CONVERT(varchar(100), GETDATE(), 12) //060516
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(), 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(), 102)//2006.05.16
Select CONVERT(varchar(100), GETDATE(), 111)//2006/05/16
Select CONVERT(varchar(100), GETDATE(), 112)//20060516
进阶 order by group by

我们经常会使用group by对查询的结果进行去重,但是在使用的过程中一定要确保 group by 里面要只是有一个唯一性的条件,否则极有可能把需要的条目去重了,导致查询结果异常,而且这个问题排查难度不小

联表查询 SQL查询多列合并一列
select ID,hosID +"/"+ hosCode +"/"+ name as "诊所编号/诊所Code/医生项目"
from Doctor where hosCode = "xxxx"
//return: 71bfc474-7725-e8fb-ecbd-a204bbaxxxxx 15xx/A75xxx/宋xx
SQL查询将多行合并成一行(转载)
//将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。
stuff(param1, startIndex, length, param2)

param1:一个字符数据表达式。param1可以是常量、变量,也可以是字符列或二进制数据列。
startIndex:一个整数值,指定删除和插入的开始位置。如果 startIndex或 length 为负,则返回空字符串。如果startIndex比param1长,则返回空字符串。startIndex可以是 bigint 类型。
length:一个整数,指定要删除的字符数。如果 length 比param1长,则最多删除到param1 中的最后一个字符。length 可以是 bigint 类型。

例如:

select STUFF("abcdefg",1,0,"1234")       --结果为"1234abcdefg"
select STUFF("abcdefg",1,1,"1234")       --结果为"1234bcdefg"
select STUFF("abcdefg",2,1,"1234")       --结果为"a1234cdefg"
select STUFF("abcdefg",2,2,"1234")       --结果为"a1234defg"

拓展:for xml path,将查询结果集以XML形式展现

现在想把两条数据通过PerworkSampleInfoId和Barcode合并成一条

select ID,PerworkSampleInfoId,Barcode, ApplyItemId,ApplyItemName,ItemPrice
from Perwork_SampleItem where Barcode = "A75004xxxxxx"

select PerworkSampleInfoId,Barcode,
    (
        select STUFF(
            (select "," + ApplyItemName from Perwork_SampleItem where Barcode = a.Barcode for xml path("")),
            1,
            1,
            ""        
        )
    ) as ApplyItemNames,
    (
        select STUFF (
            (select sum(ItemPrice) from Perwork_SampleItem where Barcode = a.Barcode),
            1,
            0,
            ""
        )
    )as totalItemPrice
from Perwork_SampleItem a
where Barcode = "A75004xxxxxx"
group by PerworkSampleInfoId,Barcode

视图 存储过程

优点:

   1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

  2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

  3.存储过程可以重复使用,可减少数据库开发人员的工作量

  4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权

缺点:

   1.如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐了。

   2.可移植性差
由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。

基本用法:

//创建存储过程
use WEHealth
go
create procedure pro_test
@_code varchar(50)
as
IF ( @_code IS NOT NULL )
    select *
    from Hospital
    where Code like "%"+@_code+"%";
    
ELSE
    select *
    from Hospital;
//调用存储过程
exec pro_test "101999";
exec pro_test null;
函数 表值函数 标量值函数

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17916.html

相关文章

  • 云服务器 ECS 建站教程:在ECS上部署数据库

    摘要:在阿里云平台上,可通过自带的镜像市场实现一键部署系统的数据库,完美解决耗时长部署易出错的缺陷。操作步骤登录云服务器管理控制台。单击左侧导航中的云服务器创建实例。在ECS上部署数据库 数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合。这种数据集合具有如下特点:尽可能不重复,以最优方式为某个特定组织的多种应用服务,其数据结构独立于使用它的应用程序,对数据的增、删、改和检索由统一软件进...

    stefan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<