SQL基础系列(3)-变量、函数、存储过程等
1. 变量
定义变量 DECLARE @a INT 赋值 SET @a=1 PRINT @a DECLARE @name NVARCHAR(30) --select 赋值 SELECT @name='zcx' PRINT @name SELECT @name=FirstName FROM dbo.Persons PRINT @name DECLARE @name NVARCHAR(50) --update 赋值 UPDATE Persons SET @name = FirstName WHERE ID = 1 PRINT @name
2. 临时表
--创建临时表1
create table #persion
(
[id] [int] NOT NULL,
[name] [nvarchar](5) NOT NULL,
[pwd] [nvarchar](20) NULL
)
insert into #persion values(1,'zcx','')
SELECT * INTO #psersion1 FROM #persion
select * from #persion UNION ALL select * from #psersion1
DROP TABLE #persion
DROP TABLE #psersion1
插入select的数据
insert into #persion select id,FirstName,LastName from dbo.Persons
注意和select into的区别
Select into 会创建新的临时表
修改临时表结构
alter table #persion add [tmpid] int NOT NULL IDENTITY(10,1)
alter table #persion add [tmpid1] uniqueidentifier NOT NULL default(newid())
给查询结果集增加自增长列
要求主表Persons没得主键
select IDENTITY(int,1,1)as ID, * into #temp from Persons
SELECT * FROM #temp
和count性质类似
select SUM(1) from Persons
有主键的表添加列
select (select SUM(1) from Persons where id<= a.id) as myID,* from Persons a order by myID
创建表变量:下面代码要同时执行
declare @mytable table
(
id int not null,
name nvarchar(50) null
)
INSERT INTO @mytable
( id, name )
VALUES ( 0, -- id - int
N'zcx' -- name - nvarchar(50)
)
INSERT INTO @mytable
( id, name )
VALUES ( 0, -- id - int
N'zjj' -- name - nvarchar(50)
)
select * from @mytable
3. 循环
DECLARE @index INT
DECLARE @resukt INT
SET @index = 1
SET @resukt = 0
WHILE @index <= 100
BEGIN
SET @resukt += @index
SET @index += 1
END
PRINT @resukt
4. 条件
IF ( 3 > 5 )
BEGIN
PRINT 'true'
END
ELSE
BEGIN
PRINT 'false'
END
When then
DECLARE @num INT
DECLARE @name NVARCHAR(30)
SET @num = 3
SET @name = CASE WHEN @num = 1 THEN 'elephant'
WHEN @num = 2 THEN 'hippo'
WHEN @num = 3 THEN 'trigger'
ELSE 'false'
END
PRINT @name
5. 游标
原则上尽量不要使用游标
(更多信息:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html)
DECLARE @name NVARCHAR(30)
DECLARE mycursor CURSOR FOR SELECT FirstName FROM dbo.Persons
--打开游标
OPEN mycursor
WHILE @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM mycursor INTO @name
PRINT @name
END
CLOSE mycursor
--回收
DEALLOCATE mycursor
6. 触发器
触发器中的临时表:
Inserted
存放进行insert和update 操作后的数据
Deleted
存放进行delete 和update操作前的数据
Create trigger persion_update
On dbo.Persons
for Update
As
declare @msg nvarchar(50)
--@msg记录修改情况
select @msg = N'姓名从“' + Deleted.FirstName + N'”修改为“' + Inserted.FirstName + '”' from Inserted,Deleted
--插入日志表
insert into TAB(Col2)values(@msg)
7. 存储过程
DROP PROCEDURE compute_add
CREATE PROCEDURE compute_add
@p1 INT ,
@p2 INT ,
@p3 INT OUTPUT
AS
BEGIN
SET @p3=@p1+@p2
END
DECLARE @result INT
EXEC compute_add 1,2,@result OUTPUT
PRINT @result
8. 函数
标量函数
CREATE FUNCTION COMPUTE_ADD ( @p1 INT, @p2 INT )
RETURNS INT
AS
BEGIN
RETURN @p1+@p2
END
调用方式
DECLARE @result INT
SET @result=dbo.COMPUTE_ADD(1,2)
PRINT @result
表值函数
CREATE FUNCTION mytable ( @id INT )
RETURNS TABLE
AS
RETURN
( SELECT *
FROM dbo.Persons
WHERE id < @id
)
调用方式
select * from dbo.mytable(3)
表值函数:返回指定的列
CREATE FUNCTION mytable ( @id INT )
RETURNS @table TABLE
(
firstname NVARCHAR(50) ,
lastname NVARCHAR(50)
)
AS
BEGIN
INSERT INTO @table
SELECT firstname ,
lastname
FROM dbo.Persons
WHERE id < @id
RETURN
END
调用方式
select * from dbo.mytable(3)
函数和存储过程区别
|
函数 |
存储过程 |
|
可以返回表变量 |
不能返回表变量 |
|
不能使用output参数 |
可以使用output参数 |
|
不能用临时表 |
可以执行对数据库表的操作,可以返回数据集 |
|
函数内部的操作不能影响到外部环境 |
|
|
不能通过select返回结果集 |
|
|
不能update,delete,数据库表(在函数内对带副作用的运算符 'UPDATE' 的使用无效。) |
|
|
必须return 一个标量值或表变量或空 |
可以return一个标量值,也可以省略return |
SQL基础系列(3)-变量、函数、存储过程等的更多相关文章
- SQL基础随记2 视图 存储过程
SQL基础随记2 视图 存储过程 View CREATE/ALTER/DROP VIEW ViewName as SELECT(...) 可以在视图的基础上继续创建视图,即,将之前创建的视图当做表 ...
- SQL基础系列(2)-内置函数--转载w3school
1. 日期函数 Mssql: SELECT GETDATE() 返回当前日期和时间 SELECT DATEPART(yyyy,OrderDate) AS OrderYear, DATEPART( ...
- Sql Server系列:字符串函数
字符串函数用于对字符和二进制字符串进行各种操作,大多数字符串函数只能作用于char.nchar.varchar和nvarchar数据类型.字符串函数可以用在SELECT或者WHERE语句中. 1. A ...
- JavaScript基础系列(变量与类型)
以下内容将JavaScript简称为JS 打开本文时不管你是零基础的初学者还是其他语言的老兵,我都想说程序语言的基础支撑起了整个网络世界,不把这些基础学透之后稍复杂的内容会让你寸步难行. 现在先给编程 ...
- Sql Server系列:排序函数
在SQL Server中有4个排序函数:ROW_NUMBER().RANK().DENSE_RANK()及NTILE()函数. 1. ROW_NUMBER()函数 ROW_NUMBER()函数为每条记 ...
- Sql Server系列:自定义函数
用户自定义函数可以像系统函数一样在查询或存储过程中调用,可以接受参数.执行操作并将操作结果以值的形式返回.返回值可以是单个标量或结果集. 1. 标量函数 标量函数返回一个确定类型的标量值,对于多语句的 ...
- 11、SQL基础整理(变量)
变量 定义变量:declare @hello varchar(20) 赋值:set @hello = ‘你好’ select(结果框显示)/print(消息框显示) @hello *三行必须同时 ...
- 5、SQL基础整理(字符串函数)
字符串函数 ASCII 返回字符串首字母的ascii编码 select ASCII('name') select ASCII(name) from xuesheng select *from xues ...
- [SQL SERVER系列]之常用函数和开窗函数介绍及实例
本文主要介绍SQL SERVER数据库中一些常用的系统函数及其SQL SERVER 2005以上支持的开窗函数. 1.常用函数 --从字符串右边截取指定字符数 select RIGHT('HELLO' ...
随机推荐
- MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)
网络上有很多MySQL表碎片整理的问题,大多数是通过demo一个表然后参考data free来进行碎片整理,这种方式对myisam引擎或者其他引擎可能有效(本人没有做详细的测试).对Innodb引擎是 ...
- F版本SpringCloud1—大白话为啥要有微服务?啥是微服务?SpringCloud为什么有那么多组件?
前言 为什么要有微服务呢? 什么是微服务? SpringCloud 中为什么会有那么多的组件? ...... 作为SpringCloud教程的第一篇,不讲解具体的技术使用,通过一个通俗易懂的小故事,来 ...
- 深入分析mysql为什么不推荐使用uuid或者雪花id作为主键
前言:在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建 ...
- 《面试经典系列》- 从底层理解==和equals的区别
前言 在我们Java面试中,基础知识基本上比定会考核的点,而“==和equals的区别”则是面试官最喜欢.最经常问的问题. 但我们看了不少的文章.解释,总是一头雾水.一知半解的,往往很容忘记.今天,我 ...
- ElegantSnap 一个优雅的,易用的iOS/tvOS/macOS自动布局框架, 超级详细的使用教程,多视图水平等宽/垂直等高排列
ElegantSnap ElegantSnap(Base on SnapKit) to make Auto Layout easy and elegant on both iOS and OS X. ...
- HTML节点操作
HTML节点操作 HTML节点的基本操作,添加节点,替换节点,删除节点,绑定事件,访问子节点,访问父节点,访问兄弟节点. 文档对象模型Document Object Model,简称DOM,是W3C组 ...
- elasticsearch基础及在Python中的简单使用
目录 一. 安装java环境与elasticsearch.kibana 二. elasticsearch.kibana的部分文件说明 三. Kibana的Dev tools中ES的简单命令 四. ES ...
- django自动生成接口文档
我们在实际项目中,会需要将我们的一些接口的信息返回给前端,便于前后端的交互,在实际使用中,这种自动生成接口文档的模块很多,我主要是用REST framework自动生成接口文档,这个需要用到的是cor ...
- Windows平台安装Beautiful Soup
Windows平台安装Beautiful Soup 2013-04-01 09:31:23| 分类: Python|举报|字号 订阅 Beautiful Soup是一个Python的一个库, ...
- 第 k 小的数
一.寻找两个有序数组的中位数 1.1 问题描述 给定两个大小为 m 和 n 的不同时为空的有序数组 nums1 和 nums2.找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m ...