变量分为局部变量和全局变量
局部变量
@是SQL中标量变量开头的必须字符,SQL规定,局部标量变量必须以@开头,全局标量变量以@@开头,全局标量变量不许声明,直接使用即可
局部变量的使用是先申明再赋值。而全局变量由系统定义和维护,可以直接使用,但一般不自定义全局变量
局部变量的名称必须以标记@作为前缀
声明局部变量的语句如下:
declare @variable name(局部变量名称) DataType(数据类型)
局部变量赋值有两种方法:使用set语句或select语句
例:
整型:
declare @num int
set @num=10
print 'num的值是:'+convert(nvarchar(32),@num)
字符串类型:(char varchar nvarchar)
declare @name nvarchar(32)
set @name='赵六'
print @name
小数类型(float decimal numeric(18,0))
declare @number decimal(18,2)
set @number=1.3
print @number
日期类型(datetime)
declare @mydate datetime
set @mydate=GETDATE()
print convert(nvarchar(32),@mydate,120)
全局变量
SqlServer中的所有全局变量都使用两个@符号作为前缀
@@IDENTITY是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。
声明局部变量的语句如下:
declare @variable name(局部变量名称) DataType(数据类型)
局部变量赋值有两种方法:使用Set语句或Select语句
常用的几个全局变量:
| :------ | :------ |
| @@error | 上一条SQL错误号 |
| @@error | 上一条SQL错误号 |
| @@identity | 最后一次插入的标识值 |
| @@rowcount | 受上一个SQL语句影响的行数 |
| @@serviceName | 该计算机上的SQL服务名称 |
| @@Version | SQLServer的版本信息 |
注:不能自己定义全局变量,不能给全局变量赋值
select语句和set语句区别
Set | Select | |
---|---|---|
同时对多个变量赋值 | 不支持 | 支持 |
表达式返回多个值时 | 出错 | 将返回的最后一个值赋给变量 |
表达式未返回值时 | 变量将赋值为NULL | 变量保持原值 |
注:被赋值的变量的数据来源于数据表的时候,不要用set,选用select
Declare @stuName nvarchar(32)
Select @stuName=studentname from student
Where studentno=23
数据类型转换
cast()与convert()函数
基本语法:
cast(表达式 as 数据类型)
convert(数据类型[(长度)],表达式[,样式])
二者在本质上无任何区别 唯一不同之处是:在将日期时间类型的数据转换为字符串数据时,convert()函数可以通过第三个参数指定转换后字符数据的显示格式不同。
case when ISNUMERIC(f.fielddata)=1 then cast(f.fielddata as money) else 0 END
逻辑控制语句
1:顺序结构控制语句
begin
语句或语句块
end
类似于C#语言的“{}”表示语句块的开始和结束
2:If-else条件语句
3:while循环语句
注:在SQL 中,只有while一种循环,没有do-while和for循环
4:case多分支语句
case-end语句计算一组条件表达式,并返回其中一个符合条件的结果
基本语法:
case
when 条件1 then 结果1
when 条件2 then 结果2
[ else 其他结果]
end
游标和其他
这是某次写的复杂存储过程
--if语句 判断表变量是否存在
IF(EXISTS(select * from tempdb..sysobjects where id = object_id(N'tempdb..#node1') and type='U'))
BEGIN
--清空表 #:表变量
TRUNCATE TABLE #node1
INSERT INTO #node1 select * from node
select * INTO #node1 from node
END
--游标
declare sale_cursor cursor
for
--游标范围
SELECT m.metaid from metabond mb LEFT JOIN meta m
on mb.metaid = m.metaid
where bonddict = 272 and MetaState <> 3 and mb.activeid = @customerId
order BY m.metaid asc
--打开游标--
open sale_cursor
--开始循环游标变量--
fetch next from sale_cursor into @saleMeta
while @@FETCH_STATUS = 0
BEGIN
--要在循环里执行的sql
--转到下一个游标,否则会死循环
fetch next from sale_cursor into @saleMeta
END
--关闭游标
close sale_cursor
--释放游标
deallocate sale_cursor
对自增列进行指定id新增或修改id
set identity_insert 表名 ON --允许对自增列Id插入指定数据
--insert or update 语句
set identity_insert 表名 OFF --关闭对自增列Id插入指定数据