sqlserver存储过程if
create proc test ------创建存储过程 test
@a int =‘’-----------创建变数 有的存储过程不需要变数,这个看个人所需要
as ---------------执行以下语句
select * from table where a=@a -------------------后面写自己需要的语句
go
--------exec test ‘1’----------执行存储过程
2. 在sqlserver的存储过程中怎样使用if-else if
跟程序中使用差不多,if,else if,else,只不过在sqlserver中,{}使用begin和end代替,里面嵌套什么的,都跟程序中写的差不多,简单实例如下:
declare@aint
set@a=1
if@a<0
begin
select'小于0'
end
elseif@a=0
begin
select'等于0'
end
else
begin
if@a>0and@a<1
begin
select'大于0小于1'
end
else
begin
select'大于1'
end
end
在简单看看程序代码:
inta=1;
if(a<0)
{
输出小于0;
}
elseif(a==0)
{
输出等于0;
}
else
{
if(a>0&&a<1)
{
输出大于0小于1;
}
else
{
输出大于1
}
}
3. sqlserver存储过程违反主键约束if语句为什么语句终止了后面els的print还能输出求解
违反主键约束只是本次if执行不成功了,就会走else,然后调用print打印。
4. 在sqlserver的存储过程中怎样使用if-else if
跟程序中使用差不多,if,else
if,else,只不过在sqlserver中,{}使用begin和end代替,里面嵌套什么的,都跟程序中写的差不多,简单实例如下:
declare
@a
intset
@a=1if
@a<0begin
select
'小于0'endelse
if
@a=0begin
select
'等于0'endelsebegin
if
@a>0
and
@a<1
begin
select
'大于0小于1'
end
else
begin
select
'大于1'
endend在简单看看程序代码:int
a=1;if(a<0){
输出小于0;}else
if(a==0){
输出等于0;}else{
if(a>0&&a<1)
{
输出大于0小于1;
}
else
{
输出大于1
}}
5. 在sqlserver的存储过程中怎样使用if-else if
ifa>b
Begin
print'a'
End
Elseifa<b
Begin
print'b'
End
Else
Begin
print'代码'
End
if-else语法为,最好不要把beginend省略掉。否则,存储过程比较长可能会报语法错误
6. 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
存储过程一般用在实现复杂的功能,数据操纵方面。
7. SQL Server的存储过程怎么写
SQL server中如何存储:
首先准备数据,测试存储过程
use ssqadm;
创建测试books表
create table books_test ( book_id int identity(1,1) primary key,
book_name varchar(20),book_price float,book_auth varchar(10));
插入测试数据
insert into books_test (book_name,book_price,book_auth)values
('论语',25.6,'孔子'),
('天龙八部',25.6,'金庸'),
('雪山飞狐',32.7,'金庸'),
('平凡的世界',35.8,'路遥'),
('史记',54.8,'司马迁');
select * from books_test;*/
创建无参存储过程
if (exists (select * from sys.objects where name = 'getAllBooks'))
drop proc getAllBooks
go
create procere getAllBooks
as
begin
select * from books_test;
调用,执行存储过程
exec getAllBooks;
end
go
修改存储过程
alter procere getallbooks
as
select book_name from books_test;
修改存储过程的名称
sp_rename getallbooks,proc_get_allbooks;
go
exec proc_get_allbooks;
go
创建带参数的存储过程
use ssqadm
go
if (exists (select * from sys.objects where name = 'searchbooks'))
drop proc searchbooks
exec searchbooks
执行存储searchbooks得到如下结果:
go
create procere searchbooks (@bookid int)--括号里面是
as
begin
declare @book_id int;定义一个标量变量,只是保证存储过程的完整性,在本存储是多此一举的。
set @book_id = @bookid;
select* from books_test where book_id = @book_id;
end;
go
-- exec searchbooks
执行存储searchbooks得到如下结果:
创建带两个参数的存储过程
use ssqadm
go
if (exists (select * from sys.objects where name = 'book_test2'))
drop proc book_test2
exec book_test2
执行存储book_test2得到如下结果:
go
create procere book_test2
(@bookid int,@bookname varchar(20))括号里面是
as
begin
declare @book_id int;
定义一个标量变量,只是保证存储过程的完整性,在本存储是多此一举的。
declare @book_name varchar(20);
set @book_id = @bookid;
set @book_name = @bookname;
select* from books_test where book_id =
@book_id and book_name = @book_name;
end;
go
exec book_test2
(7)sqlserver存储过程if扩展阅读:
SQL Server中查询存储命令子句:
USE [SSQADM]
Use 是跳转到哪个数据库,对这个数据库进行操作。
GO
GO向 SQL Server 实用工具发出一批 Transact-SQL 语句结束的信号,相当于提交上面的SQL语句。
GO是把t-sql语句分批次执行
(一步成功了才会执行下一步,即一步一个GO)
/****** Object: StoredProcere [dbo].[PROC_four_five_hr]
Script Date: 07/30/2018 13:44:55 ******/
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ON
8. 请教ms sqlserver存储过程如何写多个if语句
select @user_blog_lock='yes'elseselect @user_blog_lock='no'GO这样写,后面那二条语句是没有执行到的。用到else if 是错误的语法,如果都都用if,第二条语句以后都不能执行了
变量的输入是对的。
第二、三条IF语句是不能执行了。看联机丛书 F1
-----------------------IF...ELSE在执行 Transact-SQL 语句时强加条件。如果条件满足(布尔表达式返回 TRUE 时),则在 IF 关键字及其条件之后执行 Transact-SQL 语句。可选的 ELSE 关键字引入备用的 Transact-SQL 语句,当不满足 IF 条件时(布尔表达式返回 FALSE),就执行这个语句。
语法IF Boolean_expression
{ sql_statement | statement_block }[ ELSE{ sql_statement | statement_block } ]参数Boolean_expression
是返回 TRUE 或 FALSE 的表达式。如果布尔表达式中含有 SELECT 语句,必须用圆括号将 SELECT 语句括起来。
{sql_statement | statement_block}
Transact-SQL 语句或用语句块定义的语句分组。除非使用语句块,否则 IF 或 ELSE 条件只能影响一个 Transact-SQL 语句的性能。若要定义语句块,请使用控制流关键字 BEGIN 和 END。如果在 IF...ELSE 块的 IF 区和 ELSE 区都使用了 CREATE TABLE 语句或 SELECT INTO 语句,那么 CREATE TABLE 语句或 SELECT INTO 语句必须指向是相同的表名。
注释IF...ELSE 结构可以用在批处理中,存储过程中(经常使用这种结构测试是否存在着某个参数),以及特殊查询中。
可以在其它 IF 之后或在 ELSE 下面,嵌套另一个 IF 测试。对于嵌套层数没有限制。
示例
A. 使用一个 IF...ELSE 块
下面的示例显示带有语句块的 IF 条件。如果书的平均价格不低于 $15,那么就显示文本:Average title price is more than $15.
USE pubsIF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15BEGINPRINT 'The following titles are excellent mod_cook books:'PRINT ' 'SELECT SUBSTRING(title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'ENDELSEPRINT 'Average title price is more than $15.'
下面是结果集:
The following titles are excellent mod_cook books:Title-----------------------------------
Silicon Valley Gastronomic Treats
The Gourmet Microwave
(2 row(s) affected)
B. 使用多个 IF...ELSE 块
下面的示例使用了两个 IF 块。如果书的平均价格不低于 $15,那么就显示文本:Average title price is more than $15。如果现代烹调书的平均价格高于 $15,则显示现代烹调书价格昂贵的语句。
USE pubsIF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15BEGINPRINT 'The following titles are excellent mod_cook books:'PRINT ' 'SELECT SUBSTRING(title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'ENDELSEIF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') > $15BEGINPRINT 'The following titles are expensive mod_cook books:'PRINT ' 'SELECT SUBSTRING(title, 1, 35) AS Title
9. 在sqlserver的存储过程中怎样使用if-else if
if a>b
Begin
print 'a'
End
Else if a<b
Begin
print 'b'
End
Else
Begin
print '代码'
End