需求:用于实现省市区三级下拉菜单(简化过程,提高重用)
目的:省全部显示,市根据省ID进行显示,区根据省,市ID进行显示
使用SQL实现:组合SQL的过程
使用存储过程实现:
1
CREATE PROCEDURE PMyInfo
2
@Userid int
3
AS
4
BEGIN
5
SELECT U.UserName,U.PostCode,U.Homepage,Content,U.BirthDay,F.School,F.SchoolAge,F.DiplId,F.TechId,
6
(SELECT DepName FROM DicDep WHERE DepID = U.DepID) AS DepName,--部门
7
(SELECT TechName FROM DicTech WHERE TechID = F.TechID) AS TechName, --科室
8
(SELECT UnitName FROM DicUnit WHERE UnitID = U.UnitID) AS UnitName, --单位
9
FROM UserAdmin AS U LEFT OUTER JOIN FamousDoc AS F ON U.Userid = F.UserID
10
WHERE U.UserID = @Userid
11
END
12![]()
调用存储过程性质:有参数,返回记录集,无需分页
调用过程:
省下拉列表:rsa.open "exec ProvCityBorough",conn,1
市下拉列表:rsa.open "EXEC ProvCityBorough" & sProvId,conn,1
区下拉列表:rsa.open "EXEC ProvCityBorough "&sProvId & sCityID,conn,1 这段代码调用时没有结果(为什么)
需求:显示医生的个人信息(减少对数据库I/O的次数)
目的:医生的信息
使用SQL实现:
需要通过用户类型ID查询出用户类型为医生
通过单位ID查询单位名称及科室
通过用户的专科ID查询出专科名称
通过用户的职称ID查询出职称名称
使用存储过程实现:
1
CREATE PROC ProvCityBorough
2
@ProvID INT = 0 ,@CityID INT = 0
3
AS
4
SET NOCOUNT ON
5
BEGIN
6
IF @ProvID = 0 and @CityID = 0
7
SELECT * FROM DicProvince ORDER BY rovid
8
ELSE IF @CityID > 0 --先比较市ID,再进行比较省ID(为什么)
9![]()
10
SELECT * FROM DicBorough where ProvID = ProvID AND CityID=@CityID
11
ORDER BY BoroID
12
ELSE IF @ProvID > 0
13
SELECT * FROM DicCity WHERE ProvID = @ProvID ORDER BY Cityid
14
END
15
--调用示例
16
--EXEC ProvCityBorough 10,83
17![]()
18
19![]()
调用存储过程性质:有输入参数,有记录集,但无需分页,可用rs.open 调用
调用过程:rs.open "EXEC PMyInfo "&iUserId,conn,1
需求:注册时用户是否存在验证(对查询进行预编译,提高查询效率)
目的:接收用户名验证用户是否存在
使用SQL实现:
接收用户名,组合SQL语句,进行查询数据库
如果记录集的条数等1则提示出错返回,否则继续进行操作
存储过程代码:
1
CREATE PROCEDURE PCheckUser
2
@UserName VARCHAR(20),@Pwd VARCHAR(50),@Email VARCHAR(50)
3
AS
4
SET NOCOUNT ON
5
BEGIN
6
SELECT UserName FROM UserAdmin WHERE UserName = @UserName
7
IF @@rowcount > 0 --(@@rowcount的作用)
8
RETURN 1
9
ELSE
10
BEGIN
11
INSERT INTO(…) VALUES(…)
12
RETURN 0
13
END
14
END
15![]()
16![]()
调用存储过程性质:有参数,有返回值
调用过程:
1
<% Set Comm = Server.CreateObject("ADODB.Command")
2
with Comm
3
.ActiveConnection = Conn
4
.CommandText = "PCheckUser" .CommandType = 4 .Prepared = true
5
.Parameters.Append .CreateParameter("RETURN",2,4) --返回值参数的设置(放在第一位)
6
.Parameters.Append .CreateParameter("@UserName",200,1,50,syhm)
7
.Parameters.Append .CreateParameter("@Pwd",200,1,50,spwd)
8
.Execute
9
end with
10
if Comm(0) = 1 then --调用返回值
11
response.write "<script languge='javascript'>alert('您填写的帐号已占用!请返回重新填写.'); </script>"
12
end if
13
%>
需求:用户注册信息配置(封装业务逻辑)
目的:用户注册对个人相关的信息进行配置
使用SQL实现:
1.如果通过重复性验证,通过刚刚注册的用户名,查询出用户ID
2.将个人网站的布局和样式查出来 -- 插入到个人空间表中
3.将个人类别的公用栏目信息插到注册用户的栏目中
4.将属于个人类别的
存储过程代码:
1
CREATE PROCEDURE PRegUser
2
@UserName Varchar(20)
3
AS
4
SET NOCOUNT ON
5
DECLARE @UserId BIGINT
6
BEGIN
7
BEGIN TRANSACTION
8
--1.如果注册成功,根据注册的用户名,查找出用户ID
9
SELECT @UserId = UserId FROM UserAdmin WHERE UserName = @UserName
10
DECLARE @Spaceid BIGINT,@Cssid BIGINT --定义中转变量
11
DECLARE@LogoUrl NVARCHAR(100) --定义中转变量
12![]()
13
--2.将个人网站的第一种布局及第一种布局的第一种样式查找出来,插入到个人空间中
14
SELECTTOP1@Spaceid=Spaceid
FROM DicSpace WHERE typeid = 2
15
SELECT TOP 1 @CssID = Cssid FROM DicCss WHERE Spaceid = 9
16
--3.将查询的信息插入到个人空间的表中()
17
INSERT INTO UserSpace(…)
18
VALUES(@UserId,@Spaceid,@PreviewUrl,'嘿嘿,我也有自己的网站了',@UserName)
19
--4.将属于个人类别的公用的栏目信息插到这个注册用户的栏目中
20
INSERT INTO dictype(UserID,TypeName,TypeClass)
21
SELECT @UserId,TypeName,0 FROM dictypepub WHERE userlevelid=10
22
--5.将属于个人类别的公用相册夹插入到这个注册用户的相册类别中
23
INSERT INTO MyPicFolder SELECT @UserId,
24
FROM DicFolderPub WHERE UserLevelId=10
25
--错误处理
26
IF @@ERROR <> 0
27
BEGIN
28
ROLLBACK TRANSACTION
29
RETURN 1
30
END
31
ELSE
32
BEGIN
33
COMMIT TRANSACTION
34
RETURN @UserId
35
END
36
END
调用存储过程性质:有输入参数,有返回值,无返回记录集
调用过程
1
'将用户基本配置信息写到个人的相应数据表中
2
Set Comm = Server.CreateObject("ADODB.Command")
3
with Comm
4
.ActiveConnection = Conn
5
.CommandText = "PRegUser"
6
.CommandType = 4
7
.Prepared = true
8
.Parameters.Append .CreateParameter("RETURN",20,4)
9
.Parameters.Append .CreateParameter("@UserName",200,1,50,syhm)
10
.Execute
11
end with
12
if Comm(0) > 1 then
13
iUserId = Comm(0) ‘返回用户ID
14
else
15
response.write "<script languge='javascript'>alert('用户注册失败!请返回重新注册.');history.go(-1);</script>"
16
response.end()
17
end if
需求:更改用户类型的单位选择(多条件查数化查询)
目的:根据选择的省,市,区或是选择的条件进行查询医院单位,并可以进行分页
使用SQL实现:
1. 进入页面,未选择任何条件,显示医院的总数
2. 按省,市,区输入的内容进行条件筛选.在选择不同的省市区时即时显示医院的内容
3. 输入的医院名称进行查询
存储过程实现:
1
--功能描述:根据输入单位类别和相应的条件查询相应的单位信息
2
--输入参数:省,市,区ID,页码,单位名称查询关键字
3
--输 出:没有条件时返回单位的总数;有条件是查询单位的个数及单位的名称
4
CREATE PROC PChooseUnit
5
@ProvID varchar(20),@CityID varchar(20),@BoroId varchar(20),
6
@iPage int,@UnitName nvarchar(50),@UnitLevelID varchar(4)
7
AS
8
SET NOCOUNT ON
9
BEGIN
10
DECLARE @sqlh varchar(300), @sql varchar(300)
11
SET @sqlh = 'SELECT COUNT(*) as Counts FROM DicUnit
12
SET @sql = ' WHERE UnitTypeID =' + @UnitLevelID --根据条件进行拼合SQL
13
if @ProvId > 0 SET @sql = @sql + ' and ProvId=' + @ProvId
14
if @CityId > 0 SET @sql = @sql + ' and CityId=' + @CityId
15
if @BoroId > 0 SET @sql = @sql + ' and BoroId=' + @BoroId
16
if @UnitName <> '' SET @sql = @sql + ' and UnitName like ' + '''' + '%' + @UnitName + '%'+ ''''
17
--如果没有条件,则查询出单位的总个数并进行返回
18
--PRINT @sqlh + @sql
19
EXEC (@sqlh+@sql) ‘查询出记录的条数
20
IF @ProvId = 0 AND @BoroId = 0 AND @BoroId = 0 AND @UnitName = ''
21
BEGIN
22
RETURN 1 --表示没有条件返回
23
END
24
-- SQL语句拆分为三段此为第一段
25
SET @sqlh='SELECT UnitID,UserID,UnitName,Clicks FROM
26
(SELECT TOP 10 UnitID,UserID,UnitName,Clicks FROM (SELECT TOP'+convert(varchar(30),10*@iPage) +' UnitID,UserID,UnitName,Clicks
27
FROM dicunit
28
DECLARE @sqlb varchar(300)
29
-- SQL语句拆分为三段此为第三段
30
SET @sqlb = ' ORDER BY Clicks desc) a ORDER BY Clicks)
31
DERIVEDTBL ORDER BY Clicks desc '
32
SET @sql = @sqlh + @sql + @sqlb
33
--PRINT @SQL
34
EXEC (@sql)
35![]()
36
RETURN 0 --表示有条件返回
37![]()
38
END
39![]()
40
--调用示例
41![]()
42
--调用格式:存储过程名,省ID,市ID,区ID,页码,医院名称,单位类型
43![]()
44
--医院ID为1 器械商单位ID为2 药商单位ID为3 软件单位ID为4
45![]()
46
--EXEC PChooseUnit '17', 0,0,3,'',4
47![]()
48![]()
调用存储过程性质:有输入参数,返回值,有多个记录集的存储过程
调用过程
1
<%
2
set Comm = server.createobject("adodb.command")
3
iUnitLevelID = 1
4
with Comm
5
.ActiveConnection = conn
6
.CommandText = "PChooseUnit" '指定存储过程名
7
.CommandType = 4 '表明这是一个存储过程
8
.Prepared = true '要求将SQL命令先行编译
9
.Parameters.append .CreateParameter("return",2,4) '返回值
10
.Parameters.append .CreateParameter("@ProvID",200,1,20,sProvId) '字符串参数
11
.Parameters.append .CreateParameter("@CityID",200,1,20,sCityID)
12
.Parameters.append .CreateParameter("@BoroId",200,1,20,sBoroId)
13
.Parameters.append .CreateParameter("@iPage",3,1,4,iPage) '整型值参数
14
.Parameters.append .CreateParameter("@UnitName",200,1,50,sKey)
15
.Parameters.append .CreateParameter("@UnitLevelID",200,1,4,iUnitLevelID)
16
Set rs = .Execute
17
end with
18
iCounts = rs("Counts") ‘返回的记录总条数
19
rs.close ‘要关闭记录集,然后才能使用返回值的属性
20
if comm(0) = 1 then
21
response.write "<tr><td> </td><td>共有"&iCounts&"家医疗单位。</td></tr>"
22
else
23
rs.open
24
Set rs = rs.NextRecordset() ‘应用下个记录集
25
href="ChooseHosp.asp"
26
iPages=iCounts\10 if iCounts mod 10 >0 then iPages=iPages+1
27
if iPage>iPages then iPage=iPages
28
if not rs.eof and not rs.bof then
29
while not rs.eof
30
response.write "<tr><td>rs("UnitName")</td></tr>"
31
if rs("UserId")>0 then
32
wend
33
end if %>