# 自定义函数

  • 标量函数
    返回单一值

  • 内嵌表值函数
    返回列表

  • 多声明表值函数
    返回自定义结构的表

# 事务设置方式

begin tran
--sql语句1
if @@error<>0
 begin
   rollback tran
   return --这里除了return跳出,也可以使用goto+标签跳出事务
 end
--sql语句2
if @@error<>0
 begin
   rollback tran
   return
 end
commit tran

# 自增设置

//表主键自增重置从0开始
DBCC CHECKIDENT('TABLE_NAME',RESEED,0);

//设置主键自增长
create table test(
    Id int primary key identity(101,2),
    Name varchar(50)
);

//修改某列为自增
//sqlserver如果建表的时候不设自增,之后是没法直接修改的,需要先删再重设
alter table 表名 drop column ID
alter table 表名 add ID int identity(1,1)

# 查询重复数据

select name from test group by name having count(name) > 1

# 索引

创建索引的标准:用语频繁搜索的列,用语对数据进行排序的列

  • 唯一索引(UNIQUE):不允许两行具有相同的索引值(创建了唯一约束,系统将自动创建唯一索引),只能对定义为 NOT NULL 的列创建唯一索引
  • 主键索引:主键索引要求主键中的每个值是唯一的,(创建主键自动创建主键索引)
  • 聚集索引(CLUSTERED):表中各行的物理顺序与键值的逻辑(索引)顺序相同,表中只能包含一个聚集索引,主键列默认为聚集索引
  • 非聚集索引(NONCLUSTERED):表中各行的物理顺序与键值的逻辑(索引)顺序不匹配,表中可以有249个非聚集索引
//创建索引
create index index_name on table_name (cloumn_name) //创建普通索引 
create clustered index index_name on table_name (cloumn_name) //创建聚簇索引 
create nonclustered index index_name on table_name (cloumn_name) //非聚簇索引 
create unique index index_name on table_name(cloumn_name) //创建唯一索引

//删除索引
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY

//前两条语句是等价的,删除掉table_name中的索引index_name
//第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名
//如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则将删除第一个UNIQUE索引

全文索引 (opens new window)

# 外键约束

// 在新表中创建外键约束
CREATE TABLE Sales.TempSalesReason 
(
  TempID int NOT NULL,
  Name nvarchar(50),
  
  -- 主键约束; CONSTRAINT 约束; PK_TempSales 主键约束别名
  CONSTRAINT PK_TempSales PRIMARY KEY NONCLUSTERED (TempID),

  -- 外键约束; TempID 外键字段
  CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
  
  -- Sales.SalesReason (SalesReasonID) 外键引用字段
  -- 外键引用字段必须为主键或候选键
  REFERENCES Sales.SalesReason (SalesReasonID)

  -- 确保修改外键引用字段的值时会同步更改外键字段的值
  ON DELETE CASCADE
  ON UPDATE CASCADE
)

//在已存在的表内添加外键约束
ALTER TABLE Sales.TempSalesReason

-- FK_TempSales_SalesReason 外键约束别名
ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)

-- Sales.SalesReason (SalesReasonID) 外键引用字段
-- 外键引用字段必须为主键或候选键
REFERENCES Sales.SalesReason (SalesReasonID)

-- 确保修改外键引用字段的值时会同步更改外键字段的值
ON DELETE CASCADE
ON UPDATE CASCADE

# 游标

 declare @column1 varchar(50)=''
 declare @column2 varchar(50)=''
 declare @column3 varchar(50)=''
 declare @cursonExist int=0

 declare cursorName cursor for  
 select column1,column2,column3 from table where 1 = 1  order by column1
 open cursorName--打开游标
 fetch next from cursorName into @column1,@column2,@column3
 while @@fetch_status = 0
 begin 
      --循环遍历每一条记录,这里写业务逻辑
 fetch next from cursorName into @column1,@column2,@column3
 end
 close cursorName
 deallocate cursorName

 --删除使用的游标
 select @cursonExist=count(1) from MASTER.dbo.syscursors where cursor_name='cursorName'
 if (@cursonExist>0)  deallocate cursorName