学习完SQL的 基础理论知识,下面开始依照具体的实例来落实SQL的操作。
要求一、创建一存储过程,参数为读者编号,用于查询某读者的借阅图书情况。包括读者编号、读者姓名、图书编号、图书名称、借阅日期及归还日期。
要求一、创建一存储过程,用于统计某时间段内所有读者的编号、姓名及借阅图书编号及图书名称信息。
要求一、创建一函数,参数为读者编号,返回值为该读者借阅图书的数量。
要求四、创建一函数,参数为读者编号,返回值为表,内容为该读者的借阅图书情况。包括读者编号、读者姓名、图书编号、图书名称、借阅日期及归还日期。
要求五、对上述存储过程和自定义函数运并验证其正确性。
具体 代码实现:
1、创建一存储过程,参数为读者编号,用于查询某读者的借阅图书情况。包括读者编号、读者姓名、图书编号、图书名称、借阅日期及归还日期。
create proc informationofreader
@ReaderID char(10)
as
begin
select ReaderID,BookID,BorrowDate,ReturnDate
From borrowinf
where Reader=@ReaderID
end
go
exec informationfreader '01702904036'
--外部赋值
2、创建一存储过程,用于统计某时间段内所有读者的编号、姓名及借阅图书编号及图书名称信息。
create proc count_informationifreaderandbook
as
begin
select count(ReaderID,BookID)
from borrowinf
end
go
3、创建一函数,参数为读者编号,返回值为该读者借阅图书的数量。
create function count_booksofReader (@ReaderID as char (10))
returns int
as
begin
declare @counts int
select @counts=count(ReaderID)
from borrowinf
where ReaderID=@ReaderID
return @counts
end
Go
4、创建一函数,参数为读者编号,返回值为表,内容为该读者的借阅图书情况。包括读者编号、读者姓名、图书编号、图书名称、借阅日期及归还日期。
create function informationofReaders(@ReaderID as char (10))
returns table
as
return(select ReaderID,BookID,BorrowedDate,ReturnDate from borrowinf)
[if !supportLists]5、[endif]对上述存储过程和自定义函数运并验证其正确性。
(1)declare @ReaderID char(10)
set @ReaderID = '01702904036'
exec informationofreader '@ReaderID';
(2)count_informationifreaderandbook
(3)declare @ReaderID char(10)
set @ReaderID = '01702904036'
select dbo.count_booksofReader(@ReaderID);
(4)
declare @ReaderID char(10)
set @ReaderID = '01702904036'
select * from dbo.informationofReaders(@ReaderID);
--错将表值函数当作标量函数
总结:
这次实战主要是靠自己查资料摸索调bug才完成的,其中遇到的第一个问题就是语法不知道。
后面会附自己总结的语法
1、出现下列问题:
在与SQL Server建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。
分析:你的sqlserver服务已经安装了,就是找不到服务器名称。
解决:使用配置管理器重新配置TCP/IP协议 IP3 中IP 地址 为自己电脑的IP地址(或者是127.0.0.1) 在TCP端口添加1433,然后选择启动
[if !supportLists]2、[endif]出现下列问题:
将截断字符串或二进制数据语句已终止
分析:在数据库的表中进行了输入字符长度的限制,比如数据库表中的字段长度为5个varchar,而 在前台的输入中超出了这个长度就会报这个错。
解决:只需要更改数据库中的字段长度或者在前台测试输入时输入符合长度的字符串。
同时将几个查询执行语句放在单独的窗口中去
[if !supportLists]3、[endif]出现下列问题:
函数定义是returns语句使用不正确
在定义函数头时所使用的返回关键字是returns而不是return
[if !supportLists]4、[endif]出现下列问题:
bug 'CREATE FUNCTION'必须是查询批次中的第一个语句。
查询了很多资料后发现少了一条go语句。
[if !supportLists]5、[endif]drop后面一定要跟一条 go语句
官方说法是:GO只是SQL Server管理器(SSMS)中用来提交T-SQL语句的一个标志
GO相当于一个.sql文件的结束标记
GO不是标准SQL语句,甚至不是T-SQL语句。它只是SQL Server管理器(SSMS)中用来提交T-SQL语句的一个标志。你可以在SSMS中任意指定这个提交标志。SSMS->工具->选项->查询执行->SQL Server->批分隔符中指定这个提交标志。
[if !supportLists]6、[endif]出现调用函数是找不到函数、数据库、服务器的问题
要么连接服务器,要么显式指定数据库名称并增加dbo。
[if !supportLists]7、[endif]函数调用分为表值函数和标量函数,两种调用方法是不一样的。
[if !supportLists]8、[endif]
下面是自己根绝若干个博客总结的相关知识:
[if !supportLists](一)[endif]用户自定义函数
用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回。
sql函数必须有返回值。
ps:
函数看成一个处理某些数据的功能,因有返回值,则在代码使用中,需要一个处理过的数据。
可直接调用函数处理数据,返回数据给代码使用。
标量函数:返回一个标量值。
表格值函数{内联表格值函数、多表格值函数}:返回行集(即返回多个值)
标量函数和表格值函数的区别在于返回是标量值(单个数字或者单个数据),还是表格值(多个数据)
1、标量函数
create funetion函数名(参数)
return返回值数据类型
[with {Encryption | Schemabinding }]
[as]
begin
SQL语句(必须有return 变量或值)
End
Schemabinding :将函数绑定到它引用的对象上(注:函数一旦绑定,则不能删除、修改,除非删除绑定)
例子:
create funetion SumRes(@sco nvarchar(20))
returns real //返回值类型
as
begin
declare @sum real //变量
declare @code varchar(11) //变量
set @code = @sco + '%' //赋值
select @sum = sum(result) from LearnResult where scode like @code //查询结果赋值
return @sum
end
引用自定义函数
select用户名.函数名 as 字段别名
select dbo.AvgResult('sooo2') as result
用户自定义函数返回值可放在局部变量中,用set select exec 赋值
declare @sum1 real,@sum2 real,@sum3 real
set @sum1 = dbo.SumRes('sooo2')
select @sum2 = dbo.SumRes('sooo2')
exec @sum3 = dbo.SumRes'sooo2'
select @sum1,@sum2.@sum3
2、表格值函数
a、内联表格值函数
格式:
create function函数名(参数)
returns table
[with{ Encryption | Schemabinding }]
as
return(一条SQL语句)
例子:
create function tabcmess(@code nvarchar(50))
returns table
as
return(select id name from tableName)
b、多句表格值函数
多表格值函数的定义:包含多条SQL语句,必须或者至少有一条给表格变量赋值!!!
表格变量格式:
returns @变量名(dt) table( 列定义 | 约束定义 )
对表格变量中可以执行select, insert, update, delete,
但select into和 insert 语句的结果集是从存储过程插入。
格式:
create function函数名(参数)
return @dt table(列的定义)
[with{Encryption | Schemabinding}]
as
begin
SQL语句
end
例子:
create function tabcmess(@code nvarchar(50))
returns @dt table(id @nvarchar(20),name @nvarchar(50))
as
begin
//添加表格变量数据
insert into @dt select id name from tablename where name like @code
return
end
表格值函数的引用
select * from tabcmess(‘qoooo3’)
[if !supportLists](二)[endif]存储程序
存储过程是一组为了完成特定功能的SQL语句,类似一门程序设计语言,也包括了数据类型、流程控制、输入和输出和它自己的函数库。存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。
1、存储过程基本语法
创建存储过程
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]
[if !supportLists]2、[endif]调用存储过程
EXECUTE Procedure_name '' --存储过程如果有参数,后面加参数格式为:@参数名=value,也可直接为参数值value
3、删除存储过程
drop procedure procedure_name --在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程
4、无参数存储过程
选出Student表中的所有信息
create proc StuProcas //此处 as 不可以省略不写begin //begin 和 end 是一对,不可以只写其中一个,但可以都不写select S#,Sname,Sage,Ssex from studentendgo
5、有参数存储过程
6、全局变量
全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。
选出指定姓名的学生信息:
create proc StuProc
@sname varchar(100) as beginselect S#,Sname,Sage,Ssex from student where sname=@snameendgo
exec StuProc '赵雷' //执行语句
上面是在外部给变量赋值,也可以在内部直接给变量设置默认值
create proc StuProc
@sname varchar(100)='赵雷'as beginselect S#,Sname,Sage,Ssex from student where sname=@snameendgo
exec StuProc
也可以把变量的内容输出,使用output
7、局部变量
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内部,离开该函数后再使用这种变量是非法的。
局部变量的定义
必须先用Declare命令定以后才可以使用,declare{@变量名 数据类型}
局部变量的赋值方法
set{@变量名=表达式}或者select{@变量名=表达式}
局部变量的显示
create proc StuProcas declare @sname varchar(100)set @sname='赵雷'select S#,Sname,Sage,Ssex from student where sname=@snamego
exec StuProc
[if !supportLists](三)[endif]定义变量
全局变量DECLARE @@变量名 类型
局部变量DECLARE @变量名 类型
赋值方式:
--一. SET赋值
DECLARE @Name varchar(50),@@Name varchar(50)
SET @Name='局部张三'
SET @@Name='全局张三'
SELECT @@Name+' '+@Name
--二. SELECT 赋值
DECLARE @Name varchar(50),@@Name varchar(50)
SELECT @Name='局部张三',@@Name='全局张三'
SELECT @@Name+' '+@Name
--顺便说下
--1.变量的作用域是有限的
--2.进行变量操作,需初始化
DECLARE @Name varchar(50)
--SET @Name=''
SET @Name = @Name+'张三'
SELECT @Name --结果将为NULL
--3.变量也是存在表变量,表变量与物理表存在一定区别
网友评论