Navicat Premium || Microsoft SQL Server Management Studio
CREATE PROCEDURE 创建过程
格式
CREATE PROCEDURE [dbo].[XXBatch] --创建 XXBatch存储过程
ALTER PROCEDURE 改变或修改
ALTER PROCEDURE [dbo].[XXBatch] 修改XXBatch存储过程
@parentid INT --定义parentid为要输入的变量
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 @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
);
我发保存,提示创建错误
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;
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(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具有两种格式。简单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 函数用于将多个字符串连接为一个字符串,返回结果为连接参数产生的字符串,如果有任何一个参数为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
如需以字母顺序显示介于 “Adams”(包括)和 “Carter”(不包括)之间的人,请使用下面的 SQL:
SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'
其实就是告诉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
转换数据时间格式:如: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)
转换数据时间格式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' )
declare @a datetime
set @a =getdate()
select convert(varchar(4),year(@a))+ convert(varchar(2),month(@a))
SET FMTONLY ON
SET FMTONLY OFF
对于精度比较高的东西,比如money,用decimal类型
-- 格式:
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
--相差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存储过程入门之 游标