sqlserver存储过程表变量
create procere 把考号分配给2个班的学号最小的前5位同学
as
BEGIN
;WITH cte AS
(
SELECT rn=ROW_NUMBER()OVER(ORDER BY GETDATE()) ,* FROM EXAM
),
stuu1 AS
(
SELECT rn=ROW_NUMBER()OVER(ORDER BY stuid) ,* FROM stu WHERE clazz='1班';
),
stuu2 AS
(
SELECT rn=ROW_NUMBER()OVER(ORDER BY stuid)+5 ,* FROM stu WHERE clazz='2班';
),
stuu AS
(
SELECT * FROM stuu1
UNION ALL
SELECT * FROM stuu2
)
UPDATE c
SET c.stuID = s.stuID
FROM cte c JOIN stuu s ON c.rn=s.rn
end
Ⅱ sqlserver怎么创建存储过程
1、可视化创建
a.登录SQL Server
b.打开数据库==》要创建存储过程的数据库==》可编程性==》存储过程
c.选中“存储过程”右击 ,在系出现的对话框中选择“新建存储过程”
d.在右侧出现的对话框中填写具体存储过程内容完成后执行即可
2、代码创建
a.全手写代码
一、定义变量
--简单赋值
declare@aint
set@a=5
print@a
--使用select语句赋值
declare@user1nvarchar(50)
select@user1='张三'
print@user1
declare@user2nvarchar(50)
select@user2=NamefromST_UserwhereID=1
print@user2
--使用update语句赋值
declare@user3nvarchar(50)
updateST_Userset@user3=NamewhereID=1
print@user3
二、表、临时表、表变量
--创建临时表1
createtable#DU_User1
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL
);
--向临时表1插入一条记录
insertinto#DU_User1(ID,Oid,[Login],Rtx,Name,[Password],State)values(100,2,'LS','0000','临时','321','特殊');
--从ST_User查询数据,填充至新生成的临时表
select*into#DU_User2fromST_UserwhereID<8
--查询并联合两临时表
select*from#DU_User2whereID<3unionselect*from#DU_User1
--删除两临时表
droptable#DU_User1
droptable#DU_User2
--创建临时表
CREATETABLE#t
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL,
)
--将查询结果集(多条数据)插入临时表
insertinto#tselect*fromST_User
--不能这样插入
--select*into#tfromdbo.ST_User
--添加一列,为int型自增长子段
altertable#tadd[myid]intNOTNULLIDENTITY(1,1)
--添加一列,默认填充全球唯一标识
altertable#tadd[myid1](newid())
select*from#t
droptable#t
--给查询结果集增加自增长列
--无主键时:
selectIDENTITY(int,1,1)asID,Name,[Login],[Password]into#tfromST_User
select*from#t
--有主键时:
select(selectSUM(1)fromST_UserwhereID<=a.ID)asmyID,*fromST_UseraorderbymyID
--定义表变量
declare@ttable
(
idintnotnull,
msgnvarchar(50)null
)
insertinto@tvalues(1,'1')
insertinto@tvalues(2,'2')
select*from@t
三、循环
--while循环计算1到100的和
declare@aint
declare@sumint
set@a=1
set@sum=0
while@a<=100
begin
set@sum+=@a
set@a+=1
end
print@sum
四、条件语句
--if,else条件分支
if(1+1=2)
begin
print'对'
end
else
begin
print'错'
end
--whenthen条件分支
declare@todayint
declare@weeknvarchar(3)
set@today=3
set@week=case
when@today=1then'星期一'
when@today=2then'星期二'
when@today=3then'星期三'
when@today=4then'星期四'
when@today=5then'星期五'
when@today=6then'星期六'
when@today=7then'星期日'
else'值错误'
end
print@week
五、游标
declare@IDint
declare@Oidint
declare@Loginvarchar(50)
--定义一个游标
declareuser_curcursorforselectID,Oid,[Login]fromST_User
--打开游标
openuser_cur
while@@fetch_status=0
begin
--读取游标
fetchnextfromuser_curinto@ID,@Oid,@Login
print@ID
--print@Login
end
closeuser_cur
--摧毁游标
deallocateuser_cur
六、触发器
触发器中的临时表:
Inserted
存放进行insert和update操作后的数据
Deleted
存放进行delete和update操作前的数据
--创建触发器
CreatetriggerUser_OnUpdate
OnST_User
forUpdate
As
declare@msgnvarchar(50)
--@msg记录修改情况
select@msg=N'姓名从“'+Deleted.Name+N'”修改为“'+Inserted.Name+'”'fromInserted,Deleted
--插入日志表
insertinto[LOG](MSG)values(@msg)
--删除触发器
droptriggerUser_OnUpdate
七、存储过程
--创建带output参数的存储过程
CREATEPROCEDUREPR_Sum
@aint,
@bint,
@sumintoutput
AS
BEGIN
set@sum=@a+@b
END
--创建Return返回值存储过程
CREATEPROCEDUREPR_Sum2
@aint,
@bint
AS
BEGIN
Return@a+@b
END
--执行存储过程获取output型返回值
declare@mysumint
executePR_Sum1,2,@mysumoutput
print@mysum
--执行存储过程获取Return型返回值
declare@mysum2int
execute@mysum2=PR_Sum21,2
print@mysum2八、自定义函数
函数的分类:
1)标量值函数
2)表值函数
a:内联表值函数
b:多语句表值函数
3)系统函数--新建标量值函数
createfunctionFUNC_Sum1
(
@aint,
@bint
)
returnsint
as
begin
return@a+@b
end
--新建内联表值函数
createfunctionFUNC_UserTab_1
(
@myIdint
)
returnstable
as
return(select*fromST_UserwhereID<@myId)
--新建多语句表值函数
createfunctionFUNC_UserTab_2
(
@myIdint
)
returns@ttable
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL
)
as
begin
insertinto@tselect*fromST_UserwhereID<@myId
return
end
--调用表值函数
select*fromdbo.FUNC_UserTab_1(15)
--调用标量值函数
declare@sint
set@s=dbo.FUNC_Sum1(100,50)
print@s
--删除标量值函数
dropfunctionFUNC_Sum1
谈谈自定义函数与存储过程的区别:
一、自定义函数:
1.可以返回表变量
2.限制颇多,包括
不能使用output参数;
不能用临时表;
函数内部的操作不能影响到外部环境;
不能通过select返回结果集;
不能update,delete,数据库表;
3.必须return一个标量值或表变量
自定义函数一般用在复用度高,功能简单单一,争对性强的地方。
二、存储过程
1.不能返回表变量
2.限制少,可以执行对数据库表的操作,可以返回数据集
3.可以return一个标量值,也可以省略return
存储过程一般用在实现复杂的功能,数据操纵方面。
Ⅲ sqlserver 存储过程中变量赋值
你没有把问题写多明白啊不过看你得描述,应该是在 as后面声明的局部变量。按你得用法绝对是没有问题的,我试过没问题啊。你说的“if @cc = 0这个判断失效”是什么意思呢?是表里面有记录自然@cc!=0,,“在判断前面加select @cc的时候就可以”又是什么意思?执行存储过程的话,if只是判定条件只有select才会打印出数据~~~~~~~
Ⅳ sqlserver存储过程中 如何把表变量转换成数值
直接将表名也改为varchar(50) 就行了
要不你就用预执行
if exists(select * from sysobjects where name='proc_select')
drop proc proc_select
go
create proc proc_select
@table varchar(50)
as
declare @sql varchar(8000)
set @sql='select * from '+@table
exec(@sql)
go
exec proc_select 'Types'
Ⅳ sqlserver存储过程: Exec(@变量)在一个存储过程中调用如何有参数返回变量查询值
create proc proc_find_count13
@column_name varchar(20)
,@term varchar(20)
as
declare @sel varchar(500)
SET @sel='declare @count int ;set @count=(select count(*) from proct where ' + @column_name + ' like ''%'+@term+'%''); print @count;'
EXECute (@sel)
go
exec proc_find_count13 'p_name','c'
Ⅵ SqlServer存储过程
create
procere
prCreateSubPlan
as
begin
declare
@id
int,
@intCycle
int,
@planName
varchar(100),
@createTime
smalldatetime,
@cycleTime
int
select
@id
=
min(t_cplan_id)
from
t_cplan
while
(@id
is
not
null)
begin
select
@planName=t_plan_name,
@createTime
=
createTime,
@cycleTime
=
cycleTime
from
t_cplan
where
t_cplan_id=@id
select
@intCycle=
0
while
(@intCycle<@cycleTime)
begin
--
表t_plan
列t_plan_id是IDENTITY
列
insert
t_plan
(t_plan_name,
t_cplan_id,
createTime)
values
(@planName,
@id,
dateadd(day,
@intCycle,
@createTime))
select
@intCycle
=
@intCycle
+
1
end
select
@id
=
min(t_cplan_id)
from
t_cplan
where
t_cplan_id>@id
end
end
go
Ⅶ 有关于sqlserver的存储过程的问题:@xxx 和 declare @xxx有什么不同
@xxx 和 declare @xxx有什么不同?
前者是在已经定义的情况下使用,后者是定义。
【有疑问可以HI我,或追问,但请不要关闭问题,谢谢!】
PS:
SQL Server中定义变量的方法:
全局变量 DECLARE @@变量名 类型
局部变量 DECLARE @变量名 类型
赋值方式:
--一. SET赋值
DECLARE @Name varchar(50),@@Name varchar(50)
SET @Name='局部张三'
SET @@Name='全局张三'
SELECT @@Name+' '+@Name
--二. SELECT 赋值
DECLARE @Name varchar(50),@@Name varchar(50)
SELECT @Name='局部张三',@@Name='全局张三'
SELECT @@Name+' '+@Name
--顺便说下
--1.变量的作用域是有限的
--2.进行变量操作,需初始化
DECLARE @Name varchar(50)
--SET @Name=''
SET @Name = @Name+'张三'
SELECT @Name --结果将为NULL
--3.变量也是存在表变量,表变量与物理表存在一定区别