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賦值SELECTcast(c.pihao as VARCHAR(12)) AS '生產批號' FROMCheckIn a,DispatchQuality b,ProductionDispatchpgcp c,ProductionDispatch d,CheckInList e WHEREd.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 ) BEGINSELECT'1' END ELSE IF( @Source_ID = 1 ) BEGINSELECT'1' END ELSE IF( @Source_ID = 3 ) BEGINSELECT'1' END ELSE BEGINSELECT'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函數
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 操作符實例selectCASE 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_copy1BETWEEN 操作符實例
如需以字母順序顯示介于 “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 EffectiveTimebetween 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或5select 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()) --23select DATEPART(D,GETDATE()) --23 select DATEPART(DD,GETDATE()) --23 select DATEPART(DAY,GETDATE()) --23select 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
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存儲過程入門之 游標
總結
以上是生活随笔為你收集整理的sqlserver存储过程入门?看不懂打死我的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将存储过程的结果插入表里
- 下一篇: sqlserver存储过程入门之 游标