From cb6afe3aef7efa72e296d6041122786c2700d366 Mon Sep 17 00:00:00 2001 From: FNS Service Date: Tue, 21 Apr 2026 20:40:43 +0800 Subject: [PATCH] Update from Sync Service --- 数据库/SQLServer/SQLSERVER存储过程基本语法.md | 438 ++++++------------ 1 file changed, 154 insertions(+), 284 deletions(-) diff --git a/数据库/SQLServer/SQLSERVER存储过程基本语法.md b/数据库/SQLServer/SQLSERVER存储过程基本语法.md index f2376ec..bd68d6a 100755 --- a/数据库/SQLServer/SQLSERVER存储过程基本语法.md +++ b/数据库/SQLServer/SQLSERVER存储过程基本语法.md @@ -1,311 +1,181 @@ -一、定义变量 ---简单赋值 -```sql -declare @a int -set @a=5 -print @a --使用select语句赋值 -declare @user1 nvarchar(50) -select @user1='张三' -print @user1 -declare @user2 nvarchar(50) -select @user2 = Name from ST_User where ID=1 -print @user2 --使用update语句赋值 -declare @user3 nvarchar(50) -update ST_User set @user3 = Name where ID=1 -print @user3 +# SQL Server 存储过程基本语法 -``` -二、表、临时表、表变量 +> T-SQL 存储过程常用语法 + +--- + +## 一、变量定义 + +### 简单赋值 ---创建临时表1 ```sql -create table #DU_User1 +DECLARE @a INT +SET @a = 5 +PRINT @a + +-- 使用 SELECT 赋值 +DECLARE @user1 NVARCHAR(50) +SELECT @user1 = '张三' +PRINT @user1 ``` + +--- + +## 二、临时表 + +### 创建临时表 + +```sql +CREATE TABLE #TempTable ( -[ID] [int] NOT NULL, -[Oid] [int] NOT NULL, -[Login] [nvarchar](50) NOT NULL, -[Rtx] [nvarchar](4) NOT NULL, -[Name] [nvarchar](5) NOT NULL, -[Password] [nvarchar](max) NULL, -[State] [nvarchar](8) NOT NULL -); ---向临时表1插入一条记录 -```sql -insert into #DU_User1 (ID,Oid,[Login],Rtx,Name,[Password],State) values (100,2,'LS','0000','临时','321','特殊'); --从ST_User查询数据,填充至新生成的临时表 -select * into #DU_User2 from ST_User where ID<8 --查询并联合两临时表 -select * from #DU_User2 where ID<3 union select * from #DU_User1 --删除两临时表 -drop table #DU_User1 -drop table #DU_User2 --创建临时表 -CREATE TABLE #t -``` -( -[ID] [int] NOT NULL, -[Oid] [int] NOT NULL, -[Login] [nvarchar](50) NOT NULL, -[Rtx] [nvarchar](4) NOT NULL, -[Name] [nvarchar](5) NOT NULL, -[Password] [nvarchar](max) NULL, -[State] [nvarchar](8) NOT NULL, -) --将查询结果集(多条数据)插入临时表 -```sql -insert into #t select * from ST_User -``` ---不能这样插入 ---select * into #t from dbo.ST_User --添加一列,为int型自增长子段 -```sql -alter table #t add [myid] int NOT NULL IDENTITY(1,1) -``` ---添加一列,默认填充全球唯一标识 -```sql -alter table #t add [myid1] uniqueidentifier NOT NULL default(newid()) select * from #t -drop table #t -``` ---给查询结果集增加自增长列 --无主键时: -```sql -select IDENTITY(int,1,1)as ID, Name,[Login],[Password] into #t from ST_User -select * from #t --有主键时: -select (select SUM(1) from ST_User where ID<= a.ID) as myID,* from ST_User a order by myID -``` ---定义表变量 -```sql -declare @t table -``` -( -id int not null, -msg nvarchar(50) null + [ID] INT NOT NULL, + [Login] NVARCHAR(50) NOT NULL, + [Name] NVARCHAR(50) NOT NULL ) -```sql -insert into @t values(1,'1') -insert into @t values(2,'2') -select * from @t -``` -三、循环 ---while循环计算1到100的和 -```sql -declare @a int -declare @sum int -set @a=1 -set @sum=0 -while @a<=100 -``` -begin -```sql -set @sum+=@a -set @a+=1 -``` -end -print @sum -四、条件语句 +-- 插入数据 +INSERT INTO #TempTable (ID, Login, Name) +VALUES (100, 'LS', '临时') ---if,else条件分支 -if(1+1=2) -begin -print '对' -end -else -begin -print '错' -```sql -end --when then条件分支 -declare @today int -declare @week nvarchar(3) -set @today=3 -set @week=case -``` -when @today=1 then '星期一' -when @today=2 then '星期二' -when @today=3 then '星期三' -when @today=4 then '星期四' -when @today=5 then '星期五' -when @today=6 then '星期六' -when @today=7 then '星期日' -else '值错误' -end -```sql -print @week +-- 从查询创建 +SELECT * INTO #TempTable2 FROM ST_User WHERE ID < 8 +-- 删除 +DROP TABLE #TempTable ``` -五、游标 + +### 表变量 ```sql -declare @ID int -declare @Oid int -declare @Login varchar(50) --定义一个游标 -declare user_cur cursor for select ID,Oid,[Login] from ST_User -``` ---打开游标 -```sql -open user_cur -while @@fetch_status=0 -``` -begin ---读取游标 -```sql -fetch next from user_cur into @ID,@Oid,@Login -print @ID -``` ---print @Login -end -close user_cur ---摧毁游标 -deallocate user_cur -六、触发器 +DECLARE @t TABLE +( + id INT NOT NULL, + msg NVARCHAR(50) NULL +) -  触发器中的临时表: +INSERT INTO @t VALUES (1, 'msg1') +INSERT INTO @t VALUES (2, 'msg2') -  Inserted -  存放进行insert和update 操作后的数据 -  Deleted -  存放进行delete 和update操作前的数据 +SELECT * FROM @t +``` ---创建触发器 -```sql -Create trigger User_OnUpdate -``` -On ST_User -for Update -As -```sql -declare @msg nvarchar(50) -``` ---@msg记录修改情况 -```sql -select @msg = N'姓名从“' + Deleted.Name + N'”修改为“' + Inserted.Name + '”' from Inserted,Deleted -``` ---插入日志表 -```sql -insert into [LOG](MSG)values(@msg) --删除触发器 -drop trigger User_OnUpdate -``` -七、存储过程 +--- + +## 三、IF/ELSE 条件 ---创建带output参数的存储过程 ```sql -CREATE PROCEDURE PR_Sum +IF 条件 +BEGIN + -- 语句 +END +ELSE IF 条件 +BEGIN + -- 语句 +END +ELSE +BEGIN + -- 语句 +END ``` -@a int, -@b int, -@sum int output + +--- + +## 四、WHILE 循环 + +```sql +DECLARE @i INT = 1 + +WHILE @i <= 10 +BEGIN + PRINT @i + SET @i = @i + 1 + + -- 退出循环 + IF @i = 5 + BREAK +END +``` + +--- + +## 五、CASE 语句 + +```sql +SELECT + Name, + CASE + WHEN Score >= 90 THEN '优秀' + WHEN Score >= 60 THEN '及格' + ELSE '不及格' + END AS Grade +FROM Student +``` + +--- + +## 六、游标 + +```sql +DECLARE @id INT +DECLARE @name NVARCHAR(50) + +DECLARE my_cursor CURSOR FOR +SELECT ID, Name FROM ST_User + +OPEN my_cursor +FETCH NEXT FROM my_cursor INTO @id, @name + +WHILE @@FETCH_STATUS = 0 +BEGIN + PRINT CAST(@id AS NVARCHAR) + ' - ' + @name + FETCH NEXT FROM my_cursor INTO @id, @name +END + +CLOSE my_cursor +DEALLOCATE my_cursor +``` + +--- + +## 七、存储过程 + +### 创建存储过程 + +```sql +CREATE PROCEDURE sp_GetUser + @UserID INT AS BEGIN -```sql -set @sum=@a+@b -END --创建Return返回值存储过程 -CREATE PROCEDURE PR_Sum2 + SELECT * FROM ST_User WHERE ID = @UserID +END ``` -@a int, -@b int + +### 执行存储过程 + +```sql +EXEC sp_GetUser @UserID = 1 +``` + +### 带输出参数 + +```sql +CREATE PROCEDURE sp_CountUser + @Count INT OUTPUT AS BEGIN -Return @a+@b -```sql -END --执行存储过程获取output型返回值 -declare @mysum int -execute PR_Sum 1,2,@mysum output -print @mysum --执行存储过程获取Return型返回值 -declare @mysum2 int -execute @mysum2= PR_Sum2 1,2 -print @mysum2 + SELECT @Count = COUNT(*) FROM ST_User +END ``` -八、自定义函数 -  函数的分类: +--- -    1)标量值函数 +## 八、常用函数 -    2)表值函数 - -        a:内联表值函数 - -        b:多语句表值函数 - -    3)系统函数 - ---新建标量值函数 -```sql -create function FUNC_Sum1 -``` -( -@a int, -@b int -) -returns int -as -begin -return @a+@b -```sql -end --新建内联表值函数 -create function FUNC_UserTab_1 -``` -( -@myId int -) -returns table -as -return (select * from ST_User where ID<@myId) --新建多语句表值函数 -```sql -create function FUNC_UserTab_2 -``` -( -@myId int -) -returns @t table -( -[ID] [int] NOT NULL, -[Oid] [int] NOT NULL, -[Login] [nvarchar](50) NOT NULL, -[Rtx] [nvarchar](4) NOT NULL, -[Name] [nvarchar](5) NOT NULL, -[Password] [nvarchar](max) NULL, -[State] [nvarchar](8) NOT NULL -) -as -begin -```sql -insert into @t select * from ST_User where ID<@myId -``` -return -```sql -end --调用表值函数 -select * from dbo.FUNC_UserTab_1(15) -``` ---调用标量值函数 -```sql -declare @s int -set @s=dbo.FUNC_Sum1(100,50) -print @s --删除标量值函数 -drop function FUNC_Sum1 -``` -谈谈自定义函数与存储过程的区别: - -一、自定义函数: - -  1. 可以返回表变量 - -  2. 限制颇多,包括 - -    不能使用output参数; - -    不能用临时表; - -    函数内部的操作不能影响到外部环境; - -    不能通过select返回结果集; - -    不能update,delete,数据库表; - -  3. 必须return 一个标量值或表变量 - -  自定义函数一般用在复用度高,功能简单单一,争对性强的地方。 - -二、存储过程 - -  1. 不能返回表变量 - -  2. 限制少,可以执行对数据库表的操作,可以返回数据集 - -  3. 可以return一个标量值,也可以省略return - -   存储过程一般用在实现复杂的功能,数据操纵方面。 \ No newline at end of file +| 函数 | 说明 | +|------|------| +| `GETDATE()` | 当前日期时间 | +| `DATEADD()` | 日期加减 | +| `DATEDIFF()` | 日期间隔 | +| `ISNULL()` | 空值替换 | +| `CAST()` | 类型转换 | +| `LEN()` | 字符串长度 |