SQLServer存储过程知识点整合
一、SQL存储过程使用
----重命名存储过程-S--
--sp_rename newProc,reNewProc
----重命名存储过程-E--
----删除存储过程-S--
--drop newProc1,newProc2 --删除多个存储过程
----删除存储过程-E--
----自定义存储过程3-S--
--Create Proc newProc
--@testName varchar(30) output
--as
--begin
-- select @testName=MAX(UserName) from T_User
--end
------调用存储过程
--declare @MaxName varchar(30)
--exec newProc @MaxName output
----exec newProc 'admin'
----自定义存储过程3-E--
----自定义存储过程2-S--
--Create Proc newProc
--@testName varchar(30)
--as
--begin
-- select * from T_User where UserName=@testName
--end
----调用存储过程
--exec newProc 'admin'
----自定义存储过程2-E--
----自定义存储过程1-S--
--Create Proc newProc
--@testVarA int,
--@testVarB int,
--@testSum int Output
--as
--begin
-- set @testSum=@testVarA+@testVarB
--end
----调用存储过程
--declare @testA int
--set @testA=0
--exec newProc 600,800,@testA output
--print @testA
----自定义存储过程1-E--
-----------系统存储过程-S-----------
----使用SQL语句改变数据库名称-S--
----修改数据库
--exec sp_renamedb dbName,daNewName
----修改数据库对象
--use D_Platforms
--exec sp_rename 'table1','newTable1'
----使用SQL语句改变数据库名称-E--
----使用SQL语句附加数据库-S--
--exec sp_attach_db @dbname='数据库名称',@filename1='文件路径'
----使用SQL语句附加数据库-E--
-----------系统存储过程-E-----------
二、SQL函数使用
----自定义函数使用-S--
--create Function test_functionA(@test_var int) returns int --returns定义返回值类型
--as
--begin
--declare @sum int
--set @sum=@test_var*8
--return @sum
--end
--修改函数只需将create→alter
--print dbo.test_functionA(6000) --使用自定义函数
----自定义函数使用-E--
----日期函数使用-S--
--declare @test_Var varchar(100)
--set @test_Var=GETDATE()
--print '当前系统长时间:'+@test_Var
--set @test_Var=CONVERT(varchar(30),YEAR(GETDATE()))+CONVERT(varchar(30),MONTH(GETDATE()))+CONVERT(varchar(30),DAY(GETDATE()))
--print '当前系统日期:'+@test_Var
--set @test_Var=DATENAME(HOUR,GETDATE())+':'+DATENAME(MINUTE,GETDATE())+':'+DATENAME(SECOND,GETDATE()) --DATENAME函数,获取时间
--print '当前系统短时间:'+@test_Var
--set @test_Var=DATEPART(HOUR,GETDATE()) --DATEPART函数,获取时间
--print 'DATEPART小时:'+@test_Var
--set @test_Var=DATEADD(DAY,10,GETDATE()) --DATEADD函数,datetime类型向相加
--print 'DATEADD加10天后长时间:'+@test_Var
----日期函数使用-E--
----转换函数使用-S--
--declare @test_Var int
--set @test_Var=1000
--print 'Yes.'+CONVERT(varchar(30),@test_Var) --参数1:系统指定的类型 参数2:需转换的参数
----转换函数使用-E--
----重复,反转,替换,空格函数使用-S--
--declare @test_String1 varchar(60),@test_String2 varchar(60)
--set @test_String1='hello'
--set @test_String2=REPLICATE(@test_String1,5) --重复
--print 'REPLICATE输出结果为:'+@test_String2
--set @test_String2=REVERSE(@test_String1) --反转
--print 'REVERSE输出结果为:'+@test_String2
--set @test_String2=REPLACE(@test_String1,'l','a') --取代
--print 'REPLACE输出结果为:'+@test_String2
--set @test_String2=@test_String1+space(5)+'空格后的内容' --空格
--print 'space输出结果为:'+@test_String2
--set @test_String2=STUFF(@test_String1,2,3,'替换内容') --指定字符串长度替换
--print 'STUFF输出结果为:'+@test_String2
----重复,反转,替换,空格函数使用-E--
----去除尾部空格,截取函数使用-S--
--declare @test_String1 varchar(60),@test_String2 varchar(60)
--set @test_String1='hello world! '
--set @test_String1=RTRIM(@test_String1)
--print '字符串为:'+@test_String1
--set @test_String2=LEFT(@test_String1,5)
--print 'LEFT截取后字符串为:'+@test_String2
--set @test_String2=RIGHT(@test_String1,5)
--print 'RIGHT截取后字符串为:'+@test_String2
--set @test_String2=SUBSTRING(@test_String1,2,6)
--print 'SUBSTRING截取后字符串为:'+@test_String2
----去除尾部空格函数使用-E--
----字符串长度函数使用-S--
--declare @test_Var int,@test_String varchar(60)
--set @test_String='Money:'
--set @test_Var=LEN(@test_String)
--print '字符串长度为:'+STR(@test_Var,1,0)
----字符串长度函数使用-E--
----数值转换字符函数使用-S--
--declare @test_Var float,@test_String varchar(60)
--set @test_Var=1000.2355
--set @test_String='Money:'
--print @test_String+STR(@test_Var,7,2) --参数1:要转换数值 参数2:长度 参数3:小数精确位
----数值转换字符函数使用-E--
--大小写函数使用-S--
declare @test_String1 varchar(30),@test_String2 varchar(30),@test_Result varchar(30)
set @test_String1='upper'
set @test_Result=UPPER(@test_String1)
print @test_Result
set @test_String2='Lower'
set @test_Result=LOWER(@test_String2)
print @test_Result
--大小写函数使用-E--
----ASCII码函数使用-S--
--declare @test_String1 char(60),@test_String2 varchar(60)
--set @test_String1='H'
--select 'H的ASCII码是:',ASCII('H')
--select 'SCII码72转字符是:',CHAR(72)
----ASCII码函数使用-E--
----正负判断函数使用-S--
--declare @test_Var1 float,@test_Var2 float,@test_String varchar(30)
--set @test_Var1=RAND()
--print @test_Var1
--set @test_Var2=SIGN(@test_Var1)
--set @test_String=
-- case
-- when @test_Var2=1 then '正值'
-- else '负值'
-- end
--print @test_String
----正负判断函数使用-E--
----取整函数使用-S--
--declare @test_Var float,@test_Value1 float,@test_Value2 float
--set @test_Var=86.3
--set @test_Value1=CEILING(@test_Var)
--select '>=86.3的最小整数',@test_Value1
--set @test_Value2=FLOOR(@test_Var)
--select '<=86.3的最大整数',@test_Value2
----取整函数使用-E--
----平方根函数使用-S--
--declare @test_Var float,@test_Value float
--set @test_Var=100
--set @test_Value=SQRT(@test_Var)
--select '100平方根值:',@test_Value
----平方根函数使用-E--
----三角(反三角)函数使用-S--
----(三角)sin,cos,tan,cot类似,以sin为例
----(反三角)asin,acos,atan
--declare @test_Var float,@test_Value float
--set @test_Var=60
--set @test_Value=SIN(@test_Var)
--select '60弧度角sin值:',@test_Value
----三角(反三角)函数使用-E--
三、SQL游标的使用
----游标的使用-S--
----创建游标
--use EPS_LOB_Web
--declare testCursorB cursor scroll for
--select * from T_Test1
----打开游标
--open testCursorB
----查看游标(每次查找下一行数据)
--fetch next from testCursorB
----从后往前读
--fetch prior from testCursorB
----转向第一条(不能和只进游标一起使用[read only])
--fetch first from testCursorB
----转向第一条(不能和只进游标一起使用[read only])
--fetch last from testCursorB
----跳转到具体的某行
--fetch absolute 2 from testCursorB
----相对目前位置,向前为+,向后为-
--fetch relative 1 from testCursorB
----将提前的记录存取在变量中
--declare @testVar1 int,@testVar2 varchar(100),@testVar3 varchar(100),@testVar4 varchar(100)
--fetch relative 1 from testCursorB into @testVar1,@testVar2,@testVar3,@testVar4
--print convert(varchar(10),@testVar1) + @testVar2 +@testVar3 + @testVar4
----关闭游标
--close testCursorB
----释放游标
--deallocate testCursorA
----游标的使用-E--
四、SQL触发器的使用
----使用触发器中代码代替删除操作-S--
--create trigger testInsteadTriggerA on T_Test1 instead of delete as
--begin
-- print '替代触发器被调用'
--end
----测试替代触发器
--delete from T_Test1 where SerialNo=11
----使用触发器中代码代替删除操作-E--
----取消触发器执行顺序-S--
--sp_settriggerorder @triggername='testTriggerC',@order='none',@stmttype='insert'
----取消触发器执行顺序-S--
----定义触发器执行顺序-S--
--定义testTriggerC为第一个顺序
--sp_settriggerorder @triggername='testTriggerC',@order='first',@stmttype='insert'
--定义testTriggerA为最后一个顺序
--sp_settriggerorder @triggername='testTriggerA',@order='last',@stmttype='insert'
----定义触发器执行顺序-S--
----创建更新触发器-S--
--create trigger testTriggerB on T_Test1 for update as
----for Insert表示对表进行插入时触发
--begin
-- print '更新触发器被调用'
--end
----测试触发器
--update T_Test1 set Path='http://www.domi.com' where SerialNo=11
--select * from T_Test1
----创建更新触发器-E--
----创建插入触发器-S--
--create trigger testTriggerA on T_Test1 for Insert as
----for Insert表示对表进行插入时触发
--begin
-- print 'testTriggerC触发器被调用'
--end
----测试触发器
--insert into T_Test1 values('音乐','多米','www.domi.com')
--select * from T_Test1
----创建插入触发器-E--
--删除触发器... delete触发器以此类推 0_0
----利用触发器在两张表中同时插入数据-S--
----创建触发器
--create trigger triggerTestInsertA on T_Test1 for insert as
--begin
-- insert into T_Test2 values('7','8')
--end
----测试
--insert into T_Test1 values('音乐','酷我','http://www.kuwo.com')
--select * from T_Test1
--select * from T_Test2
----删除测试数据
--delete from T_Test1 where SerialNo=12
--delete from T_Test2 where ID=10
----释放替代触发器
--drop trigger triggerTestInsertA
----利用触发器在两张表中同时插入数据-E--
----修改触发器-S--
--alter trigger testTriggerA on T_Test1 for Insert as
--begin
-- print 'testTriggerA触发器修改后被调用'
--end
----修改触发器-E--
--查看触发器基本信息-S--
exec sp_help testTriggerA
--查看触发器基本信息-E--
--查看触发器完整代码-S--
exec sp_helptext testTriggerA
--查看触发器完整代码-E--
五、SQL高级用法
数据库操作:
1.SQL数据库,在存储过程中执行其他存储过程
--删除5天之前的工单
exec Proc_DelWorkorderBeforeDay5
2.数据库定期删除逾时数据
BEGIN
--删除100天之前的料表
delete from T_Component where WorkOrderID in (select SerialNo from T_WorkOrder where AddDate < dateadd(dd,-100,getdate()))
--删除100天之前的工单
delete from T_WorkOrder where AddDate < dateadd(dd,-100,getdate())
--删除100天之前的临时表(记录DIP的状态)
delete from T_RecordResult_DIP where WorkOrderID in (select SerialNo from T_WorkOrder where AddDate < dateadd(dd,-100,getdate()))
END
3.--查询工单是否存在,若不存在,则写入机种ID,并返回1
select @workorderID=SerialNo from T_WorkOrder where WorkOrder=@Workorder
if(ISNULL(@workorderID,0) = 0)
begin
--工单不存在,写入工单和机种ID
insert into T_WorkOrder(WorkOrder,ModelID) values(@Workorder,@ModelID);
set @Result = 1;
return @Result;
end
{提示:ISNULL(列名,0)函数是用来判断列名是否为null,如果为NUll,则返回0. 否则,返回列名的值}
4.根据变量来修改数据表中的值
--更改BOM比对结果
update T_WorkOrder set Result_BOM=(case when @Result=1 then @Result else '-1' end) where SerialNo=@workorderID;
以下在学习SQL过程中遇到的问题(逐步更新)
1. UNION的用法
——UNION指令的目的是将两个 SQL 语句的结果合并起来。从这个角度看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。union只是将两个结果联结起来一起显示,并不是联结两个表………… UNION 的语法如下:
[SQL 语句 1]
UNION
[SQL 语句 2]
注意,UNION内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT 语句中的列的顺序必须相同。
与UNIONALL的区别,UNIONALL会显示合并后的所有列,而UNION则不会。
2. 如何将两个表中相同类型的列联结起来一起显示,并去掉重复列
——selectComponent from T_BOM_M as M (推荐使用)
union
select S.Component from T_BOM_M as M, T_BOM_S as S
或
select M.Component from T_BOM_M as M, T_BOM_S as S
union
select S.Component from T_BOM_Mas M, T_BOM_S as S
3. 怎样对多表连接之后的新表进行操作
——利用AS给新表起个别名,再进行操作
4. 存储过程的新建,不要使用反编译脚本生成,应该使用新建一个查询写代码,因为在反编译的文件中,误操作可能会修改文件的内容,导致使用了改存储过程的应用程序无法正常使用。
5. 关于给存储过程传参的问题
——a.存储过程默认参数传输方向是Input,若要返回值,需设置参数为Output
传入参数:cmd.Parameters.Add(newOleDbParameter("@MainPN", OleDbType.VarChar)).Value = strMainPN;
传出参数:cmd.Parameters.Add(newOleDbParameter("@Result", OleDbType.VarChar,1024)).Direction =ParameterDirection.Output;
b.接收存储过程返回的值
cmd.ExecuteNonQuery();
strSubPN =cmd.Parameters["@Result"].Value.ToString();
6.删除表中重复列(利用临时表)
——selectdistinct * into #tmp from T_User
Delete* from T_User
Insertinto T_User select * from #tmp
SQLServer存储过程知识点整合相关推荐
- SQLSERVER存储过程基本语法
一.定义变量 --简单赋值 declare @a int set @a=5 print @a --使用select语句赋值 declare @user1 nvarchar(50) select @ ...
- 网络工作室暑假后第二次培训资料(SQLServer存储过程和ADO.NET访问存储过程)整理(一)...
因为昨天我的SQL Server 2008数据库在使用的时候突然就打不开了.而起前天还用它来写T-SQL语句来着.所以很是郁闷啊,到网上查询以后,不能解决,就干脆重新安装了一边,所以昨天整理的内容不能 ...
- PHP写sqlserver事务,php调用sqlserver存储过程使用事务处理
第一次编写 sqlserver存储过程并在php里调用,把脑瓜都整大了,奋战了一天多最后还是搞定了. 实现功能:在 sqlserver里面实现事务处理,保证数据库操作安全: 接收sqlserver存储 ...
- python获取数据库的存储过程_python远程调用sqlserver存储过程记录
开发中需要python远程调用sqlserver存储过程.搜索了网上有两种方式,pymssql和pyodbc.开始采用第一种方式开发,不过无法拿到存储过程中的返回数据,后采用pyodbc开发,当然存储 ...
- java调用存储过程sqlserver_Java调用SqlServer存储过程怎么实现 | 学步园
在使用Java开发时,经常会遇到调用SqlServer存储过程的问题.下面学步园小编来讲解下Java调用SqlServer存储过程怎么实现? Java调用SqlServer存储过程怎么实现 1.数据库 ...
- 破解SQLSERVER存储过程的加密
破解SQLSERVER存储过程的加密 http://download.csdn.net/detail/liujiayu2/8620519
- sqlserver存储过程入门之 游标
1.游标是SQL的一个内存工作区,由系统或用户以变量的形式定义. 以下是基本步伐: 不懂的问我 定义,打开 ,使用,关闭,释放 DECLARE @temp VARCHAR(12) -- 临时变量 de ...
- sqlserver存储过程入门?看不懂打死我
sqlserver存储过程入门 1.工具 2.基础知识 游标 DECLARE 赋值 set 赋值 into if else 代替 REPLACE CASE WHEN CONCAT 函数 字符串连接 B ...
- SQL Server -- SQLserver 存储过程执行错误记录到表
SQLserver 存储过程执行错误记录到表 From: http://blog.csdn.net/leshami/article/details/51333650 对于在执行存储过程中碰到的一 ...
最新文章
- linux 安装jdk yum安装 源码包安装
- OkHttp3 websocket
- [云炬学英语]每日一句2020.9.5
- visio网络拓扑图_人才测评模型是什么?5步了解好看模型图
- 分页 Paginator
- 程序设计用户生日怎么发推送_生日祝福:儿子生日怎么发朋友圈说说 儿子生日怎么写祝福语...
- 强大的Mockito测试框架
- python 获取内存使用率_获取一个python实例的总内存和cpu使用率
- android 自定义取色器,Android Studio设置颜色拾色器工具Color Picker教程
- 放弃OneNote,拥抱 Obsidian
- css中的flow-root属性
- 第三方登录数据库用户表结构设计
- 为什么被证明“拖后腿”的苹果Mini手机,仍然还会再次发布新款?
- mysql单元组多元组_CDA数据分析师-数据分析练习题2套
- 五万字总结,深度学习基础。
- render方法的使用
- 成就感和尊严,给你快乐
- 电磁波传播相位是否会变化,关于电磁波的相位不变性和多普勒效应的讨论
- Int里-128到127的学问
- C++四个数排序(从小到大)
热门文章
- 编译Android源码,执行lunch命令时报错“No such file: /root/.lunchrc”的解决办法
- 微信小程序云开发操作全解
- excel转word_pdf转word软件永久jpg图片ppt转换excel编辑器压缩合并拆分去水印,加入自律圈即可获得!!!...
- 计算机毕业设计ssm动漫交流与推荐分析系统633g7系统+程序+源码+lw+远程部署
- 2022年旅游网站开发功能分析、开发意义在哪
- 锐角三角函数怎么用计算机算,锐角三角函数:运用计算器
- c32循迹小车c语言程序,stm32篇--小车循迹
- BugkuCTF-Crypto题python_jail
- 绿色版本ps cs5 不能复制汉字【解决方法】
- 无人机路径规划1:orbslam2+VIO