Files
chill_notes/数据库/SQLSERVER存储过程基本语法.md
2026-04-21 17:42:54 +08:00

311 lines
6.1 KiB
Markdown
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
一、定义变量
--简单赋值
```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
```
二、表、临时表、表变量
--创建临时表1
```sql
create table #DU_User1
```
(
[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
)
```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
四、条件语句
--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
```
五、游标
```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
六、触发器
  触发器中的临时表:
  Inserted
  存放进行insert和update 操作后的数据
  Deleted
  存放进行delete 和update操作前的数据
--创建触发器
```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
```
七、存储过程
--创建带output参数的存储过程
```sql
CREATE PROCEDURE PR_Sum
```
@a int,
@b int,
@sum int output
AS
BEGIN
```sql
set @sum=@a+@b
END --创建Return返回值存储过程
CREATE PROCEDURE PR_Sum2
```
@a int,
@b int
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
```
八、自定义函数
  函数的分类:
    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返回结果集
    不能updatedelete数据库表
  3. 必须return 一个标量值或表变量
  自定义函数一般用在复用度高,功能简单单一,争对性强的地方。
二、存储过程
  1. 不能返回表变量
  2. 限制少,可以执行对数据库表的操作,可以返回数据集
  3. 可以return一个标量值也可以省略return
   存储过程一般用在实现复杂的功能,数据操纵方面。