sqlserver存储过程入门?看不懂打死我

sqlserver存储过程入门

      • 1.工具
      • 2.基础知识
        • 游标 DECLARE
        • 赋值 set
        • 赋值 into
        • if else
        • 代替 REPLACE
        • CASE WHEN
        • CONCAT 函数 字符串连接
        • BETWEEN 操作符实例
        • delimiter $ && whele
      • 转换数据时间格式
        • convert (SQLserver)
      • 数据库当前时间
        • 计算出上个月第一天日期
        • DATE_FORMAT
        • @a =getdate() 日期时间转成字符串
        • Decimal 类型
      • 时间差函数
        • SQLserver
        • MySQL

不懂的问我!!

1.工具

Navicat Premium || Microsoft SQL Server Management Studio

2.基础知识

  • 新建 CREATE

CREATE PROCEDURE 创建过程

格式

CREATE PROCEDURE [dbo].[XXBatch]  --创建 XXBatch存储过程


  • 修改 ALTER

ALTER PROCEDURE 改变或修改

ALTER PROCEDURE [dbo].[XXBatch]  修改XXBatch存储过程
@parentid INT                --定义parentid为要输入的变量
游标 DECLARE
1.  DECLARE @temp VARCHAR(12) -- 临时变量, 游标
2.  declare product_cursor cursor for select id from CheckInConfirmList where ParentID=@CheckInConfirmID
2.1 open product_cursor -- 打开游标
2.2  fetch product_cursor in variable;  -- 使用游标
2.3  close product_cursor      -- 关闭游标
2.4  DEALLOCATE product_cursor  --释放游标

关键字: declare,cursor for,open ,fetch next from…into @,close

案例:

ALTER PROCEDURE [dbo].[XXBatch_Parent] 
@ParentID int 
AS 
declare @tempID varchar(50)   -- 建游标
declare product_cursor cursor for select batchNum from CheckInList  where parentid = @ParentID    -- 定义游标
open product_cursor  -- 打开游标
fetch next from product_cursor into @tempID   -- 使用游标

BEGIN
select @tempID;  
	close product_cursor   -- 关闭游标
END
赋值 set
SET @temp = (--set赋值
		SELECT
			cast(c.pihao as VARCHAR(12)) AS '生产批号' 
		FROM
			CheckIn a,
			DispatchQuality b,
			ProductionDispatchpgcp c,
			ProductionDispatch d,
			CheckInList e 
		WHERE
			d.ProductionOrderID= c.ParentID 
			AND c.ParentID= b.RelationID 
			AND b.RelationID= a.id 
			AND a.id= e.ParentID 
			AND e.ParentID=@ParentID 
		); 
赋值 into

​ 我发保存,提示创建错误

declare emp_name varchar(32) default 'unkown' ;
	declare emp_no int default 0;
	select e.empno,e.ename into emp_no,emp_name from emp e where e.empno = 7839;
	select emp_no,emp_name;
if else
ALTER PROCEDURE [dbo].[XXOOceshi] @Source_ID INT AS
IF
	( @Source_ID = 14 ) BEGIN
	SELECT
		'1' 
END ELSE
IF
	( @Source_ID = 1 ) BEGIN
	SELECT
		'1' 
END ELSE
IF
	( @Source_ID = 3 ) BEGIN
	SELECT
		'1' 
	END ELSE BEGIN
	SELECT
	'1' 
END
代替 REPLACE
REPLACE(C.出生地,'/','-')
-- 将字段address中查询出来的结果里的所有‘九’换成‘十’
select *,replace(address,'九','十') AS rep   from test_tb    
-- 例子:
isnull(REPLACE(C.现住址,'/','-'),'-') as XZZ, -- 现住址
isnull(REPLACE(C.电话,'/','-'),'-') as DH,  -- 现住址电话
isnull(REPLACE(C.住址邮编,'/','-'),'-') as YB1,  -- 现住址邮政编码
CASE WHEN

Case具有两种格式。简单Case函数和Case搜索函数。
简单Case函数

CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
CASE WHEN C.身份证号 IS NULL THEN '-' ELSE CASE WHEN RIGHT(C.身份证号,1)='x' THEN CONCAT(LEFT(C.身份证号,17),'X') ELSE C.身份证号 END END  as ZJHM,--	证件号码 
CONCAT 函数 字符串连接

CONCAT 函数用于将多个字符串连接为一个字符串,返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null

select concat(name,'ui') from Course -- 解释:将表Course字段name与字符串'ui'连接起来
结果: 张三ui
select concat(name,fengshu) from Course -- 解释:将表Course字段name与字段fengshu连接起来
select concat (health_center, department) as info from collect_copy1
结果:
info(字段)
乌帕尔镇卫生院门诊外科
托克扎克镇卫生院门诊外科

实例:

BETWEEN 操作符实例select
	CASE WHEN id_card IS NULL THEN '-' ELSE CASE WHEN RIGHT(id_card,1)='x' THEN CONCAT(LEFT(id_card,17),'X') ELSE id_card END END  as 证件号,
	CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' else '其他' END as 性别
from collect_copy1


BETWEEN 操作符实例

如需以字母顺序显示介于 “Adams”(包括)和 “Carter”(不包括)之间的人,请使用下面的 SQL:

SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'
delimiter $ && whele

其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令

案例

delimiter $ 
drop PROCEDURE if EXISTS dowhile; 
CREATE PROCEDURE dowhile()   
BEGIN 
DECLARE v1 INT DEFAULT 0; 
WHILE v1 < 30 DO   -- 建立循环     
-- INSERT INTO drama_source(url,`status`,type) VALUES("http://haxibiao.com",0,3);
UPDATE drama_source SET `status`=-1 WHERE uuid='1';
SET v1 = v1 + 1;  -- 标记循环次数
END WHILE;   -- 结束循环
SELECT v1;   -- 打印循环次数
END; $   
 
delimiter ;   
call dowhile


  -- 执行后存储过程:
CREATE DEFINER=`root`@`localhost` PROCEDURE `dowhile`()
BEGIN 
DECLARE v1 INT DEFAULT 0; 
WHILE v1 < 30 DO   -- 建立循环
UPDATE drama_source SET `status`=-1 WHERE uuid='1';
SET v1 = v1 + 1;  -- 标记循环次数
END WHILE;   -- 结束循环
SELECT v1;   -- 打印循环次数
END

转换数据时间格式

convert (SQLserver)

转换数据时间格式:如:2021-10-20 00:00:00.000 转换为 2021-10 :

-- EffectiveTime为字段  
convert(varchar(7),EffectiveTime,120) as EffectiveTime



between CONVERT(varchar(100),left(#{time},10),20) and CONVERT(varchar(100),right(#{time},10),20) (MySQL)

数据库当前时间

-- 获取当前日期
select CONVERT(varchar,GETDATE(),120)
-- 获取当前年
select DATENAME(YYYY,GETDATE())
select DATENAME(YEAR,GETDATE())  
select DATEPART(YYYY,GETDATE())  
select DATEPART(YEAR,GETDATE())  

select YEAR(时间字段名) 

-- 获取当前月 --05或5

select DATENAME(MM,GETDATE())  
select DATENAME(MONTH,GETDATE())   
select DATEPART(MM,GETDATE())  
select DATEPART(MONTH,GETDATE())  
select MONTH(时间字段名) 

-- 获取当前日期 --07或7
select DATENAME(DAY,GETDATE()) --23
select DATENAME(D,GETDATE()) --23
select DATENAME(DD,GETDATE()) --23

select DATEPART(D,GETDATE()) --23
select DATEPART(DD,GETDATE()) --23 
select DATEPART(DAY,GETDATE()) --23

select DAY(GETDATE())

-- 获取当前年月 --201705
select CONVERT(varchar(6),GETDATE(),112) --201804 
select CONVERT(varchar(7),GETDATE(),120) --2018-04

--获取当前年月日 --20170501
select CONVERT(varchar(8),GETDATE(),112) --20180423 
select CONVERT(varchar(10),GETDATE(),120) --2018-04-23

-- 字符串转日期:
select CONVERT(datetime,'2018-04-23',20)






计算出上个月第一天日期
----返回月份减去1,计算出上个月第一天日期--
 select DATEADD(MM,DATEDIFF(MM,0,GETDATE())-1,0)       -- 2021-12-01 00:00:00.000

--减去3毫秒,计算出上个月的最后一天日期(sql精确到3毫秒)--
 select DATEADD(MS,-3,DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0))    --2021-12-31 23:59:59.997
 
 --返回上月查询日期(开始到结束) 日期类型转字符类型--
        set @startDate = CONVERT(varchar(19),DATEADD(MM,DATEDIFF(MM,0,GETDATE())-1,0),120)    
        set @endDate = CONVERT(varchar(19),DATEADD(MS,-3,DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)),120)
 
DATE_FORMAT

转换数据时间格式MySQL

between DATE_FORMAT(left(#{time},10),'%Y-%c-%d 00:00:00' ) and DATE_FORMAT(right(#{time},10),'%Y-%c-%d 23:59:59' )
@a =getdate() 日期时间转成字符串
declare @a datetime
set @a =getdate()
select convert(varchar(4),year(@a))+   convert(varchar(2),month(@a))

SET FMTONLY ON

SET FMTONLY OFF

Decimal 类型

对于精度比较高的东西,比如money,用decimal类型

时间差函数

SQLserver
-- 格式:
DATEDIFF ( date-part, date-expression-1, date-expression-2 )

date-part :
    year | quarter | month | week | day | hour | minute | second | millisecond

select DATEDIFF(DAY, '2018-03-20 23:59:00', '2018-03-22 00:00:00');  -- 结果: 2
select DATEDIFF(month , '2018-2-20 23:59:00', '2018-03-22 00:00:00');-- 结果: 1
MySQL
--相差2天
select datediff('2018-03-22 09:00:00', '2018-03-20 07:00:00');
--相差1天
select TIMESTAMPDIFF(DAY, '2018-03-20 23:59:00', '2015-03-22 00:00:00');
--相差49小时
select TIMESTAMPDIFF(HOUR, '2018-03-20 09:00:00', '2018-03-22 10:00:00');
--相差2940分钟
select TIMESTAMPDIFF(MINUTE, '2018-03-20 09:00:00', '2018-03-22 10:00:00');

--相差176400秒

select TIMESTAMPDIFF(SECOND, '2018-03-20 09:00:00', '2018-03-22 10:00:00'); 

sqlserver存储过程入门之 游标

你可能感兴趣的:(MySQL,sqlserver,数据库,database)