存储过程内建临时表和临时函数,合并一个由存储过程返回的表
2008-11-26 15:02
459 查看
第一次发文章到首页,如果内容不好,请多见谅
由于项目需要,要在一个存储过程里建临时表和临时函数,来合并由一个存储过程综合了N个表的返回表,中间遇到了很多麻烦,现在终于弄好了。
先看最后的代码吧,一些注释在存储过程里有了:
CREATE PROCEDURE [dbo].[sp_ChangeStop_Second_Combination]
@StartStopName nvarchar(64),
@EndStopName nvarchar(64),
@TopNumber int
AS
BEGIN
SET NOCOUNT ON;
If object_id('TemptbChangeStop') is not null
Drop Table TemptbChangeStop
--通过sp_ChangeStop_Second_ResultByStopName存储过程,建立临时表
Create Table TemptbChangeStop
(
StartStopName nvarchar(64),
FirstLineName nvarchar(64),
FirstTotal int,
InterStopName nvarchar(64),
SecondLineName nvarchar(64),
SecondTotal int,
EndStopName nvarchar(64),
TotalStation int
)
Insert into TemptbChangeStop
--sp_ChangeStop_Second_ResultByStopName存储过程返回的表为未合并的表
Exec('sp_ChangeStop_Second_ResultByStopName '+@StartStopName+','+@EndStopName+',80')
Declare @FirstFunction nvarchar(1024)
Set @FirstFunction = 'Create Function dbo.f_ChangeStop_Combination1(@StartStopName nvarchar(64),@InterStopName nvarchar(64),@EndStopName nvarchar(64),@TotalStation int)
Returns nvarchar(256)
As
Begin
Declare @re varchar(256)
Set @Re = ''''
Select @Re=
--去掉经过的重复线路,注意:'',''+SecondLineName+''(''可以更精确的去掉重复线路,减少再一次的数据分拆和合并
Case When Charindex('',''+FirstLineName+''('',@Re)>0
Then @Re
Else @Re+'',''+FirstLineName+''(经过''+Cast(FirstTotal As varchar) + ''站)''
End
From TemptbChangeStop
Where StartStopName=@StartStopName And
InterStopName=@InterStopName And
EndStopName=@EndStopName And
TotalStation=@TotalStation
Return(Stuff(@Re,1,1,''''))
End'
--通过临时表,建立临时函数,合并第一次乘车线路和经过的站点条数
If object_id('f_ChangeStop_Combination1') is not null
Drop function f_ChangeStop_Combination1
--临时函数用Exec sp_executesql来建立
Exec sp_executesql @FirstFunction
-- Go
Declare @SecondFunction nvarchar(1024)
Set @SecondFunction = 'Create Function dbo.f_ChangeStop_Combination2(@StartStopName nvarchar(64),@InterStopName nvarchar(64),@EndStopName nvarchar(64),@TotalStation int)
Returns nvarchar(256)
As
Begin
Declare @re varchar(256)
Set @Re = ''''
Select @Re=
--去掉经过的重复线路,注意:'',''+SecondLineName+''(''可以更精确的去掉重复线路,减少再一次的数据分拆和合并
Case When Charindex('',''+SecondLineName+''('',@Re)>0
Then @Re
Else @Re+'',''+SecondLineName+''(经过''+Cast(SecondTotal As varchar) + ''站)''
End
From TemptbChangeStop
Where StartStopName=@StartStopName And
InterStopName=@InterStopName And
EndStopName=@EndStopName And
TotalStation=@TotalStation
Return(Stuff(@Re,1,1,''''))
End'
--通过临时表,建立临时函数,合并第二次乘车线路和经过的站点条数
If object_id('f_ChangeStop_Combination2') is not null
Drop function f_ChangeStop_Combination2
--临时函数用Exec sp_executesql来建立
Exec sp_executesql @SecondFunction
-- Go
--得到最终数据
Select Top(@TopNumber) StartStopName,FirstPassBy=dbo.f_ChangeStop_Combination1(StartStopName,InterStopName,EndStopName,TotalStation),InterStopName,SecondPassBy=dbo.f_ChangeStop_Combination2(StartStopName,InterStopName,EndStopName,TotalStation),EndStopName,TotalStation
From TemptbChangeStop
Group By StartStopName,InterStopName,EndStopName,TotalStation
Order By TotalStation
If object_id('f_ChangeStop_Combination1') is not null
Drop function f_ChangeStop_Combination1
If object_id('f_ChangeStop_Combination2') is not null
Drop function f_ChangeStop_Combination2
-- Go,这里用Go会出错的
If object_id('TemptbChangeStop') is not null
Drop Table TemptbChangeStop
END
执行未合并的存储过程的结果如下:
Exec('sp_ChangeStop_Second_ResultByStopName '+'新街口'+','+'新安江街'+',50')
合并后结果如下:
Declare @Time datetime
Set @Time = getdate();
Exec('sp_ChangeStop_Second_Combination 新街口,新安江街,10' )
Select datediff(ms,@Time,getdate())
平均执行300多到400多毫秒,时间上比较多,以后我还要优化。
如果各位有其它的方法,可以优化查询效率,希望告诉我下。
这个系统是南京公交查询系统,提供手机短信查询和WEB结合的查询,现在核心结构和核心代码都写好了,处理细节更花时间 :)
www.nj84.com和短信输入南京公交到12114查询(现在WEB还没怎么做好,功能也没放上去,以后用它会象GOOGLE那样提示的),感兴趣的欢迎和我交流。 :)
由于项目需要,要在一个存储过程里建临时表和临时函数,来合并由一个存储过程综合了N个表的返回表,中间遇到了很多麻烦,现在终于弄好了。
先看最后的代码吧,一些注释在存储过程里有了:
CREATE PROCEDURE [dbo].[sp_ChangeStop_Second_Combination]
@StartStopName nvarchar(64),
@EndStopName nvarchar(64),
@TopNumber int
AS
BEGIN
SET NOCOUNT ON;
If object_id('TemptbChangeStop') is not null
Drop Table TemptbChangeStop
--通过sp_ChangeStop_Second_ResultByStopName存储过程,建立临时表
Create Table TemptbChangeStop
(
StartStopName nvarchar(64),
FirstLineName nvarchar(64),
FirstTotal int,
InterStopName nvarchar(64),
SecondLineName nvarchar(64),
SecondTotal int,
EndStopName nvarchar(64),
TotalStation int
)
Insert into TemptbChangeStop
--sp_ChangeStop_Second_ResultByStopName存储过程返回的表为未合并的表
Exec('sp_ChangeStop_Second_ResultByStopName '+@StartStopName+','+@EndStopName+',80')
Declare @FirstFunction nvarchar(1024)
Set @FirstFunction = 'Create Function dbo.f_ChangeStop_Combination1(@StartStopName nvarchar(64),@InterStopName nvarchar(64),@EndStopName nvarchar(64),@TotalStation int)
Returns nvarchar(256)
As
Begin
Declare @re varchar(256)
Set @Re = ''''
Select @Re=
--去掉经过的重复线路,注意:'',''+SecondLineName+''(''可以更精确的去掉重复线路,减少再一次的数据分拆和合并
Case When Charindex('',''+FirstLineName+''('',@Re)>0
Then @Re
Else @Re+'',''+FirstLineName+''(经过''+Cast(FirstTotal As varchar) + ''站)''
End
From TemptbChangeStop
Where StartStopName=@StartStopName And
InterStopName=@InterStopName And
EndStopName=@EndStopName And
TotalStation=@TotalStation
Return(Stuff(@Re,1,1,''''))
End'
--通过临时表,建立临时函数,合并第一次乘车线路和经过的站点条数
If object_id('f_ChangeStop_Combination1') is not null
Drop function f_ChangeStop_Combination1
--临时函数用Exec sp_executesql来建立
Exec sp_executesql @FirstFunction
-- Go
Declare @SecondFunction nvarchar(1024)
Set @SecondFunction = 'Create Function dbo.f_ChangeStop_Combination2(@StartStopName nvarchar(64),@InterStopName nvarchar(64),@EndStopName nvarchar(64),@TotalStation int)
Returns nvarchar(256)
As
Begin
Declare @re varchar(256)
Set @Re = ''''
Select @Re=
--去掉经过的重复线路,注意:'',''+SecondLineName+''(''可以更精确的去掉重复线路,减少再一次的数据分拆和合并
Case When Charindex('',''+SecondLineName+''('',@Re)>0
Then @Re
Else @Re+'',''+SecondLineName+''(经过''+Cast(SecondTotal As varchar) + ''站)''
End
From TemptbChangeStop
Where StartStopName=@StartStopName And
InterStopName=@InterStopName And
EndStopName=@EndStopName And
TotalStation=@TotalStation
Return(Stuff(@Re,1,1,''''))
End'
--通过临时表,建立临时函数,合并第二次乘车线路和经过的站点条数
If object_id('f_ChangeStop_Combination2') is not null
Drop function f_ChangeStop_Combination2
--临时函数用Exec sp_executesql来建立
Exec sp_executesql @SecondFunction
-- Go
--得到最终数据
Select Top(@TopNumber) StartStopName,FirstPassBy=dbo.f_ChangeStop_Combination1(StartStopName,InterStopName,EndStopName,TotalStation),InterStopName,SecondPassBy=dbo.f_ChangeStop_Combination2(StartStopName,InterStopName,EndStopName,TotalStation),EndStopName,TotalStation
From TemptbChangeStop
Group By StartStopName,InterStopName,EndStopName,TotalStation
Order By TotalStation
If object_id('f_ChangeStop_Combination1') is not null
Drop function f_ChangeStop_Combination1
If object_id('f_ChangeStop_Combination2') is not null
Drop function f_ChangeStop_Combination2
-- Go,这里用Go会出错的
If object_id('TemptbChangeStop') is not null
Drop Table TemptbChangeStop
END
执行未合并的存储过程的结果如下:
Exec('sp_ChangeStop_Second_ResultByStopName '+'新街口'+','+'新安江街'+',50')
合并后结果如下:
Declare @Time datetime
Set @Time = getdate();
Exec('sp_ChangeStop_Second_Combination 新街口,新安江街,10' )
Select datediff(ms,@Time,getdate())
平均执行300多到400多毫秒,时间上比较多,以后我还要优化。
如果各位有其它的方法,可以优化查询效率,希望告诉我下。
这个系统是南京公交查询系统,提供手机短信查询和WEB结合的查询,现在核心结构和核心代码都写好了,处理细节更花时间 :)
www.nj84.com和短信输入南京公交到12114查询(现在WEB还没怎么做好,功能也没放上去,以后用它会象GOOGLE那样提示的),感兴趣的欢迎和我交流。 :)
相关文章推荐
- 存储过程内建临时表和临时函数,合并一个由存储过程返回的表
- 在一个存储过程中调用返回一个游标的另一个存储过程
- DB2存储过程--创建临时表,返回临时表集合
- 在存储过程中如何使用另一个存储过程返回的结果集
- 常用的sql server 函数、存储过程、临时表总结
- java调用存储过程(返回游标变量,利用索引表,临时表)
- 编写一个交错合并列表元素的函数。例如:给定的两个列表为[a,B,C]和[1,2,3],函数返回[a,1,B,2,C,3]。
- 1. 给定两个整形变量的值,将两个值的内容进行交换。 2. 不允许创建临时变量,交换两个数的内容(附加题) 3. 求10 个整数中最大值。 4. 写一个函数返回参数二进制中 1 的个数
- 存储过程提示临时表字段不存在的解决办法--直接修改临时表的名称,用唯一值作为名称
- 给所有存储过程加所有人权限的一个存储过程
- C#获取一个即返回结果集,又返回值的存储过程
- 13.0 Mybatis_扩展_存储过程_oracle中创建一个带游标的存储过程
- 分享一个分页存储过程和分页函数
- 存储过程——存储过程与函数(四)
- 在MSSQL中一个存储过程调用另一个存储过程
- MSSQL数据库:存储过程实例学习(1)从两个表中取出头两行,然后合并到一个表中
- 分页存储过程(一)使用sql2005的新函数构造分页存储过程
- sql中一个分解字符串的实用函数(也可用于存储过程中的 in 查询)
- 存储过程或自定义函数调用存储过程的变通实现方法
- 在数据库里执行 返回参数时,不是存储过程返回的值,而是跟在存储过程后面的那个@output变量