目录
SQlServer数据库基础... 1
一、 创建语句... 3
(1)创建数据库... 3
(2)创建表格... 3
二、删除语句... 5
(1)删除数据库... 5
(2)删除表格... 5
(3)清空数据... 5
(4)删除某行数据... 5
(5)删除某列数据... 6
三、修改语句... 6
(1)修改表格... 6
四、查询语句... 8
(1)单表查询... 8
(2)多表查询... 9
(3)嵌套查询... 11
(4)聚合查询... 12
(5)排序... 13
(6)常用的系统函数... 14
五、插入语句... 15
(1)给表格添加新的列... 15
(2)添加表格数据... 16
六、约束... 17
(1)主键约束... 17
(2)外键约束... 18
(3)唯一约束... 19
(4)检查约束... 19
(5)初建表格多个约束同时进行... 19
(6)删除约束... 20
七、视图... 20
(1)创建视图... 20
(2)删除视图... 21
(3)更新视图... 21
(4)查询视图... 22
八、存储过程... 22
(1)创建存储过程... 23
(2)删除存储过程... 27
(3)存储过程,视图,聚合查询综合应用... 27
1.检查系统中是否存在这个数据库,存在则删除
格式:
if exists(select * from sysdatabases where name='数据库名')
drop database 数据库名
go
例子:
if exists(select * from sysdatabases where name='musicDB')
drop database musicDB
go
2.创建数据库
格式:
create database 数据库名
go
例子:
create database musicDB
go
1. 检查数据库中是否存在这个表,存在则删除
格式:
if exists(select * from sysobjects where name='表名')
drop table 表名
例子:
if exists(select * from sysobjects where name='T_speciality')
drop table T_speciality;
2.创建表
格式:
create table 表名(
列名1 数据类型,
列名2 数据类型
…………
)
go
例子:
create table T_speciality(
specialityid varchar(20) primary key,
specialityname varchar(20)
)
go
格式:
drop database 数据库名
例子:
drop database mystyle
格式:
drop table 表格名称
例子:
drop table tbl_Music
格式:
truncate table 表名
例子:
truncate table tbl_Music
格式:
delete from 表名 where 列名='条件'
例子:
delete from tbl_Music where musicName='菊花台'
注意:当没有where条件时则会清空整张表的数据
格式:
alter table 表名 drop column 列名
例子:
alter table tbl_Music drop column singer_id
注意:使用该语句则会将该列的所有的数据都删除,包括列名
1.修改表名
格式:
exec sp_rename '旧表名', '新表名';
例子:
exec sp_rename 'tbl_Music', 'musics';
注意:更改对象名的任一部分都可能会破坏脚本和存储过程。所以不赞成修改表名
2.修改表属性
增加一列
格式:
alter table 表名
add 列名 字符类型
例子:
alter table tbl_Music
add score varchar(20)
3.修改列名名字
格式:
exec sp_rename '表名.旧列名','新列名','column'
例子
exec sp_rename 'musics.musicid','id','column'
注意:这样修改同样会破坏储存过程,建议先删除这一列再添加新的列。
4.修改列数据类型
格式:
alter table 表名 alter column 列名 新的数据类型
例子:
alter table musics alter column clicknumber varchar(20)
注意:主键不能修改,字符型的不能转为int型的。
5.修改表格数据
格式:
update 表名 set 列名='修改的值'
where 条件
例子:
update musics set clicknumber='200'
where id=3
注意:主键不能修改
数据库查询的基本格式为:
select ----输出(显示)你要查询出来的值
from -----查询的依据,数据来源
where -----筛选条件(对依据(数据库中存在的表))
group by -----对筛选后的数据 进行分组
having ----- 筛选条件(对分组后的结果再次筛选)
order by -----将结果进行排序
基本语法格式顺序不能变,但可以缺省
1.查询全部
格式:
select * from 表名
“*”代表所有列
例子:
select * from musics
2.查询指定列
格式:
select 列名 as '别名',列名
from 表名
也可以不给列取别名
例子:
select id as '账号',musicname
from musics
内连接 |
全连接 |
左连接 |
右连接 |
Inner join |
Full Outer join |
Left join |
Right join |
内连接:此语句的结果为同时匹配表a和表b的记录集。即内连接取的是两个表的交集。
外连接:(全连接,左右连接)语句的结果为表a与表b的并集,即任意一个表的内容都将被查询出来,如果另一个表无对应的项,则显示为null
三种连接只是表格的对应顺序不一样
格式:
select *
from 表名1 别名1
inner join 表名2 别名2
on 别名1.主键=别名2.外键
例子:
select *
from [dbo].[tbl_Music] t1
inner join [dbo].[tbl_Menu] t2
on t1.musicId=t2.musicId
结果展示:
格式:
select *
from 表名1 别名1
[full/left/right]join 表名2 别名2
on 别名1.主键=别名2.外键
例子:
select *
from [dbo].[tbl_Music] t1
full join [dbo].[tbl_Menu] t2
on t1.musicId=t2.musicId
结果展示:
格式:
select *
from 表名1 别名1
inner join(
子查询语句
) 别名2
on 别名1.共同拥有的键名=别名2. 共同拥有的键名
go
例子:
select t4.userName as '用户名',t4.menuName as'歌单名',t3.musicName as '歌曲名',t3.clickNumber as'点击数量'
from [dbo].[tbl_Music] t3
inner join(
select t1.userId,t1.userName,t2.musicId,t2.menuName
from [dbo].[tbl_User] t1
inner join [dbo].[tbl_Menu] t2
on t1.userId=t2.userId) t4
on t3.musicId=t4.musicId
go
注意:
子查询语句中不能使用select *,应为使用select * 查询了所有的内容,就会由两个相同的列,并且在查询中必须把与主查询相同的键给查询出来,否则无法进行连接查询。
1.聚合函数
聚合函数如下所示:
min ---最小 max ---最大
sum ---和 avg ---平均
count ---统计(个数)
聚合函数一般和分组group by一起使用
例:select avg(age)from student group by sex
2.聚合查询
SELECT 所有查询的内容
FROM 表
GROUP BY 分组条件
例子:
- • 统计每个客户经理所经手的质押业务数
SELECT t1.agency_id AS '客户经理编号',COUNT(*)AS '客户数量'
FROM
t_agency_info t1
RIGHT JOIN
t_impawn_info t2
ON t1.agency_id=t2.agency_id
GROUP BY t2.agency_id
结果展示:
注意:
一旦使用min ,max ,sum,avg ,count 只能查询相对应的聚合数,和分组条件,其他的都不能再查询了。
排序分为降序和升序。
升序:
select * from emp order by id asc
降序:
select * from emp order by id desc
按多列排序:
select * from emp order by id asc,name asc
限制固定行数显示:
select top 2 id,name from emp where deptno=2
返回百分之多少行:
select top 20 percent id,name from emp where deptno=2
日期参数及缩写如下表所示:
日期部分 |
缩写 |
year |
yy, yyyy |
month |
mm, m |
day |
dd, d |
week |
wk, ww |
weekday |
dw |
hour |
hh |
minute |
mi, n |
second |
ss, s |
例子:
-- 获取当前年份
select datename(yy,GETDATE());
select datename(yyyy,GETDATE());
select datename(year,GETDATE());
格式:
alter table 表名
add 列名 数据类型
go
例子:
alter table tbl_Music
add score varchar(20)
go
方法一:安照列名依次给出数据值,不能交换顺序,数据类型不能出错
insert into demo values
('zhang',25,1),
('li',28,2)
方法二:安照指定顺序给出数据值
insert into demo (nname,age,sex) values ('san',18,0)
方法三:交换顺序,数值按照列名给就行
insert into demo (nname,sex,age) values ('san',1,22)
方法四:没给数值的列显示null
insert into demo (nname) values ('li')
2.复制表中数据到另一个表中:
insert into demo1(nname,nage,asex) select nname,age,sex from demo
注意事项
1:每次插入一行数据,不可能只插入半行或者几列数据,因此,插入的数据是否有效将按照整行的完整性的要求来检验;
2:每个数据值的数据类型、精度和小数位数必须与相应的列匹配;
3:不能为标识列指定值,因为它的数字是自动增长的;
4:如果在设计表的时候就指定了某列不允许为空,则必须插入数据;
5:插入的数据项,要求符合检查约束的要求
6:具有缺省值的列,可以使用default(缺省)关键字来代替插入的数值
格式:
alter table 表名
add constraint 主键名 primary key (列名)
go
例子:
alter table t_student
add constraint pk_t_student primary key (stud_id)
go
注意:在建表的时候主键不能为空
复合主键即两个字段可以不唯一,但是两个字段联合起来必须是唯一的,例如一些手机,华为p10,魅族Pro10,iphone pro12,只有商标和型号联合起来才是一个唯一且不重复的值.
格式:
alter table 表名
add primary key(列名1,列名2)
go
例子:
alter table [dbo].[phone]
add primary key(brand,type)
go
注意:
在建表的时候这两个字段必须非空,因为主键非空且唯一.
标示列为非空自动增长且 不可自行修改的 主关键字一般用来在一个表中引用来自于另一个表中的特定记录 其为非空 唯一的 其可以有一个以上的列合为主键 相同点就是都不可为空且都是唯一的 能理解这些就够用了 给分吧!
格式:
create table 表名(标识列名 int identity(1,1) primary key not null )
其中(1,1)是表示从1开始,每行自增1
例子:
create table phone(id int identity(1,1) primary key not null )
格式:
alter table 表名 add constraint 外键关系名foreign key (外键名) references
主键表名 (主键)
例子:
alter table t_user add constraint FK_t_user_t_group_id foreign key (groupid) references t_group (id)
格式:
alter table 表名 add constraint 约束关系名unique(列名)
例子:
alter table Users add constraint UQ_Users_Name unique(Name)
格式:
alter table Users add constraint 约束关系名 check(约束条件)
例子:
alter table Users add constraint CK_Users_Age check(Age>0 and Age<100)
例子:
create table Users (
Id int identity(1,1) primary key ,
Name nvarchar(32) unique,
Phone nvarchar(16) not null,
Email nvarchar(128) default('[email protected]'),
Age int check(Age>0 and Age<100),
Sex char(2) check(Sex in('男','女')),
createtime datetime default(getdate())
foreign key(pid)references partment(pid)
)
alter table 表名 drop constraint 约束名
视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上,视图中并不存放数据,而是存放在视图所引用的原始表(基表)中,同一张原始表,根据不同用户的不同需求,可以创建不同的视图
视图的用途:
筛选表中的行
防止未经许可的用户访问敏感数据
降低数据库的复杂程度
将多个物理数据库抽象为一个逻辑数据库
格式:;
create view 视图名称
as
sql语句
例子:
-- 4.5编写视图查询借书人的姓名,手机号码和地址;
create view VW_borrow_student
as
select c.card_name as '姓名',c.mobile as '电话号码'
from [dbo].[T_borrow] B
left join [dbo].[T_card] as C
on b.card_no=c.card_no
go
格式:
drop view 视图名
例子:
drop view VW_borrow_student
视图是一张虚拟表不适合更新,可以先删除再修改.我只遇到过这种情况可以更新.
create view VW_1
as
select * from [dbo].[musics]
where musicName='菊花台'
update VW_1
set score='100'
where id='3'
select * from VW_1
其中的score被更新至200
格式:
select * from 视图名
例子:
select * from VW_1
存储过程(procedure)用来执行管理任务或应用复杂的业务规则,存储过程可以带参数,也可以返回结果。
存储过程可以包含数据操纵语句、变量、逻辑 控制语句等,比如:单个select语句,select语句块,select语句与逻辑控制块。
存储过程优点:
执行速度更快
允许模块化程序设计
提高系统安全性
减少网络流通量
格式:
创建:
create proc 存储过程名
as
sql语句
查询:
exec 存储过程名
例子:
create proc proc_1
as
select * from [dbo].[musics]
exec proc_1
格式:
创建:
create proc 存储过程名
@参数名 参数类型
as
带有数据的sql语句,其中参数又@参数名代替
go
查询:
exec 存储过程名 参数
例子:
-- 4.6 编写存储过程,查询指定图书名称的借阅次数。
create proc book_times
@num int
as
select bookname from [dbo].[T_book] where loan=@num
-- end
go
exec book_times 30
例1:
create proc P_Titles_ByTitleID_SelectPrice2
@title_id varchar(6), --输入参数
@price money output --输出参数
as
select @price=price from titles where title_id=@title_id
go
----执行
declare @price2 money ----1,先声明变量
exec P_Titles_ByTitleID_SelectPrice2 ----2.之后在调用
@title_id='BU1032',
@price=@price2 output ----3.配参后面要加output标识
select @price2 ----4.之后在查声明变量
例2:
create proc my_musice
@score varchar(20),
@musicName varchar(40) output
as
select @musicName=musicName
from [dbo].[musics]
where score=@score
go
declare @musicName2 varchar(40)
exec my_musice
@score='20',
@musicName=@musicName2 output
select @musicName2
结果展示:
4.带变量和返回值的存储过程
--创建
use test
go
create proc testReturn
@deptno char(10),
@deptname char(10)
as
declare @dname char(10)
select @dname=name from dept where id=@deptno
if (@dname=@deptname)
return 1
else
return 0
go
--执行
DECLARE @rs char(10)
exec @rs=testReturn @deptno='1', @deptname='soft'
select @rs
格式:
drop proc 存储过程名
例子:
drop proc my_musice
例子:
--将点击数最高的那首歌插入某个歌单。
-- 创建视图查找到点击量最高的歌曲id
create view vw_maxclick
as
select musicid
from [dbo].[tbl_Music]
where clickNumber=(select max(clickNumber)
-- 利用子查询查到最高点击量,根据点击量查找点击量最高的歌曲
from [dbo].[tbl_Music])
go
-- 创建带参数的存储过程,将查询的结果赋值给参数
create proc inser_music
@menuName varchar(40),
@userid int,
@musicid int
as
ins
数据库查询的基本格式为:
select ----输出(显示)你要查询出来的值
from -----查询的依据,数据来源
where -----筛选条件(对依据(数据库中存在的表))
group by -----对筛选后的数据 进行分组
having ----- 筛选条件(对分组后的结果再次筛选)
order by -----将结果进行排序
基本语法格式顺序不能变,但可以缺省
1.查询全部
格式:
select * from 表名
“*”代表所有列
例子:
select * from musics
2.查询指定列
格式:
select 列名 as '别名',列名
from 表名
也可以不给列取别名
例子:
select id as '账号',musicname
from musics
内连接 |
全连接 |
左连接 |
右连接 |
Inner join |
Full Outer join |
Left join |
Right join |
内连接:此语句的结果为同时匹配表a和表b的记录集。即内连接取的是两个表的交集。
外连接:(全连接,左右连接)语句的结果为表a与表b的并集,即任意一个表的内容都将被查询出来,如果另一个表无对应的项,则显示为null
三种连接只是表格的对应顺序不一样
格式:
select *
from 表名1 别名1
inner join 表名2 别名2
on 别名1.主键=别名2.外键
例子:
select *
from [dbo].[tbl_Music] t1
inner join [dbo].[tbl_Menu] t2
on t1.musicId=t2.musicId
结果展示:
格式:
select *
from 表名1 别名1
[full/left/right]join 表名2 别名2
on 别名1.主键=别名2.外键
例子:
select *
from [dbo].[tbl_Music] t1
full join [dbo].[tbl_Menu] t2
on t1.musicId=t2.musicId
结果展示:
格式:
select *
from 表名1 别名1
inner join(
子查询语句
) 别名2
on 别名1.共同拥有的键名=别名2. 共同拥有的键名
go
例子:
select t4.userName as '用户名',t4.menuName as'歌单名',t3.musicName as '歌曲名',t3.clickNumber as'点击数量'
from [dbo].[tbl_Music] t3
inner join(
select t1.userId,t1.userName,t2.musicId,t2.menuName
from [dbo].[tbl_User] t1
inner join [dbo].[tbl_Menu] t2
on t1.userId=t2.userId) t4
on t3.musicId=t4.musicId
go
注意:
子查询语句中不能使用select *,应为使用select * 查询了所有的内容,就会由两个相同的列,并且在查询中必须把与主查询相同的键给查询出来,否则无法进行连接查询。
1.聚合函数
聚合函数如下所示:
min ---最小 max ---最大
sum ---和 avg ---平均
count ---统计(个数)
聚合函数一般和分组group by一起使用
例:select avg(age)from student group by sex
2.聚合查询
SELECT 所有查询的内容
FROM 表
GROUP BY 分组条件
例子:
- • 统计每个客户经理所经手的质押业务数
SELECT t1.agency_id AS '客户经理编号',COUNT(*)AS '客户数量'
FROM
t_agency_info t1
RIGHT JOIN
t_impawn_info t2
ON t1.agency_id=t2.agency_id
GROUP BY t2.agency_id
结果展示:
注意:
一旦使用min ,max ,sum,avg ,count 只能查询相对应的聚合数,和分组条件,其他的都不能再查询了。
排序分为降序和升序。
升序:
select * from emp order by id asc
降序:
select * from emp order by id desc
按多列排序:
select * from emp order by id asc,name asc
限制固定行数显示:
select top 2 id,name from emp where deptno=2
返回百分之多少行:
select top 20 percent id,name from emp where deptno=2
日期参数及缩写如下表所示:
日期部分 |
缩写 |
year |
yy, yyyy |
month |
mm, m |
day |
dd, d |
week |
wk, ww |
weekday |
dw |
hour |
hh |
minute |
mi, n |
second |
ss, s |
例子:
-- 获取当前年份
select datename(yy,GETDATE());
select datename(yyyy,GETDATE());
select datename(year,GETDATE());
格式:
alter table 表名
add 列名 数据类型
go
例子:
alter table tbl_Music
add score varchar(20)
go
方法一:安照列名依次给出数据值,不能交换顺序,数据类型不能出错
insert into demo values
('zhang',25,1),
('li',28,2)
方法二:安照指定顺序给出数据值
insert into demo (nname,age,sex) values ('san',18,0)
方法三:交换顺序,数值按照列名给就行
insert into demo (nname,sex,age) values ('san',1,22)
方法四:没给数值的列显示null
insert into demo (nname) values ('li')
2.复制表中数据到另一个表中:
insert into demo1(nname,nage,asex) select nname,age,sex from demo
注意事项
1:每次插入一行数据,不可能只插入半行或者几列数据,因此,插入的数据是否有效将按照整行的完整性的要求来检验;
2:每个数据值的数据类型、精度和小数位数必须与相应的列匹配;
3:不能为标识列指定值,因为它的数字是自动增长的;
4:如果在设计表的时候就指定了某列不允许为空,则必须插入数据;
5:插入的数据项,要求符合检查约束的要求
6:具有缺省值的列,可以使用default(缺省)关键字来代替插入的数值
格式:
alter table 表名
add constraint 主键名 primary key (列名)
go
例子:
alter table t_student
add constraint pk_t_student primary key (stud_id)
go
注意:在建表的时候主键不能为空
复合主键即两个字段可以不唯一,但是两个字段联合起来必须是唯一的,例如一些手机,华为p10,魅族Pro10,iphone pro12,只有商标和型号联合起来才是一个唯一且不重复的值.
格式:
alter table 表名
add primary key(列名1,列名2)
go
例子:
alter table [dbo].[phone]
add primary key(brand,type)
go
注意:
在建表的时候这两个字段必须非空,因为主键非空且唯一.
标示列为非空自动增长且 不可自行修改的 主关键字一般用来在一个表中引用来自于另一个表中的特定记录 其为非空 唯一的 其可以有一个以上的列合为主键 相同点就是都不可为空且都是唯一的 能理解这些就够用了 给分吧!
格式:
create table 表名(标识列名 int identity(1,1) primary key not null )
其中(1,1)是表示从1开始,每行自增1
例子:
create table phone(id int identity(1,1) primary key not null )
格式:
alter table 表名 add constraint 外键关系名foreign key (外键名) references
主键表名 (主键)
例子:
alter table t_user add constraint FK_t_user_t_group_id foreign key (groupid) references t_group (id)
格式:
alter table 表名 add constraint 约束关系名unique(列名)
例子:
alter table Users add constraint UQ_Users_Name unique(Name)
格式:
alter table Users add constraint 约束关系名 check(约束条件)
例子:
alter table Users add constraint CK_Users_Age check(Age>0 and Age<100)
例子:
create table Users (
Id int identity(1,1) primary key ,
Name nvarchar(32) unique,
Phone nvarchar(16) not null,
Email nvarchar(128) default('[email protected]'),
Age int check(Age>0 and Age<100),
Sex char(2) check(Sex in('男','女')),
createtime datetime default(getdate())
foreign key(pid)references partment(pid)
)
alter table 表名 drop constraint 约束名
视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上,视图中并不存放数据,而是存放在视图所引用的原始表(基表)中,同一张原始表,根据不同用户的不同需求,可以创建不同的视图
视图的用途:
筛选表中的行
防止未经许可的用户访问敏感数据
降低数据库的复杂程度
将多个物理数据库抽象为一个逻辑数据库
格式:;
create view 视图名称
as
sql语句
例子:
-- 4.5编写视图查询借书人的姓名,手机号码和地址;
create view VW_borrow_student
as
select c.card_name as '姓名',c.mobile as '电话号码'
from [dbo].[T_borrow] B
left join [dbo].[T_card] as C
on b.card_no=c.card_no
go
格式:
drop view 视图名
例子:
drop view VW_borrow_student
视图是一张虚拟表不适合更新,可以先删除再修改.我只遇到过这种情况可以更新.
create view VW_1
as
select * from [dbo].[musics]
where musicName='菊花台'
update VW_1
set score='100'
where id='3'
select * from VW_1
其中的score被更新至200
格式:
select * from 视图名
例子:
select * from VW_1
存储过程(procedure)用来执行管理任务或应用复杂的业务规则,存储过程可以带参数,也可以返回结果。
存储过程可以包含数据操纵语句、变量、逻辑 控制语句等,比如:单个select语句,select语句块,select语句与逻辑控制块。
存储过程优点:
执行速度更快
允许模块化程序设计
提高系统安全性
减少网络流通量
格式:
创建:
create proc 存储过程名
as
sql语句
查询:
exec 存储过程名
例子:
create proc proc_1
as
select * from [dbo].[musics]
exec proc_1
格式:
创建:
create proc 存储过程名
@参数名 参数类型
as
带有数据的sql语句,其中参数又@参数名代替
go
查询:
exec 存储过程名 参数
例子:
-- 4.6 编写存储过程,查询指定图书名称的借阅次数。
create proc book_times
@num int
as
select bookname from [dbo].[T_book] where loan=@num
-- end
go
exec book_times 30
例1:
create proc P_Titles_ByTitleID_SelectPrice2
@title_id varchar(6), --输入参数
@price money output --输出参数
as
select @price=price from titles where title_id=@title_id
go
----执行
declare @price2 money ----1,先声明变量
exec P_Titles_ByTitleID_SelectPrice2 ----2.之后在调用
@title_id='BU1032',
@price=@price2 output ----3.配参后面要加output标识
select @price2 ----4.之后在查声明变量
例2:
create proc my_musice
@score varchar(20),
@musicName varchar(40) output
as
select @musicName=musicName
from [dbo].[musics]
where score=@score
go
declare @musicName2 varchar(40)
exec my_musice
@score='20',
@musicName=@musicName2 output
select @musicName2
结果展示:
4.带变量和返回值的存储过程
--创建
use test
go
create proc testReturn
@deptno char(10),
@deptname char(10)
as
declare @dname char(10)
select @dname=name from dept where id=@deptno
if (@dname=@deptname)
return 1
else
return 0
go
--执行
DECLARE @rs char(10)
exec @rs=testReturn @deptno='1', @deptname='soft'
select @rs
格式:
drop proc 存储过程名
例子:
drop proc my_musice
例子:
--将点击数最高的那首歌插入某个歌单。
-- 创建视图查找到点击量最高的歌曲id
create view vw_maxclick
as
select musicid
from [dbo].[tbl_Music]
where clickNumber=(select max(clickNumber)
-- 利用子查询查到最高点击量,根据点击量查找点击量最高的歌曲
from [dbo].[tbl_Music])
go
-- 创建带参数的存储过程,将查询的结果赋值给参数
create proc inser_music
@menuName varchar(40),
@userid int,
@musicid int
as
insert into [dbo].[tbl_Menu] values
( @menuName,@userid,@musicid
)
go
-- 执行储存过程
declare @menuName varchar(40),@userid int,@musicid int
select @menuName='我喜欢的歌曲',@userid=1, @musicid=(select * from vw_maxclick)
exec inser_music @menuName ,@userid,@musicid
ert into [dbo].[tbl_Menu] values
( @menuName,@userid,@musicid
)
go
-- 执行储存过程
declare @menuName varchar(40),@userid int,@musicid int
select @menuName='我喜欢的歌曲',@userid=1, @musicid=(select * from vw_maxclick)
exec inser_music @menuName ,@userid,@musicid