第一次发文章到首页,如果内容不好,请多见谅

由于项目需要,要在一个存储过程里建临时表和临时函数,来合并由一个存储过程综合了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那样提示的),感兴趣的欢迎和我交流。 :)

转载于:https://www.cnblogs.com/Lawson/archive/2008/11/26/1341491.html

存储过程内建临时表和临时函数,合并一个由存储过程返回的表相关推荐

  1. Python built-in module time 内建时间库常用函数

    built-in module time 1. time() time_ns() 从1970-1-1 0:00到现在的秒数.纳秒数.返回值类型分别为float和int,两者的值相差10^9倍. tim ...

  2. Python3.5源码分析-内建模块builtins初始化

    Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3模块初始化与加载 Python的模块分为内建的模 ...

  3. python内置类属性_python常用内建属性大全

    在python中创建一个类,它不仅有我们自定义的属性和方法,还有与生俱来的一些属性和方法,我们叫它内建属性. 下面是类常用内建属性列表. __init__ 负责一个类实例化中的初始化操作 __new_ ...

  4. 【Bash百宝箱】shell内建命令之builtin、command、caller

    1.builtin 在shell中,内建(builtin)命令builtin,格式如下: builtin shell-builtin [arguments] builtin命令用以执行shell的内建 ...

  5. Python-特殊方法(迭代器,生成器,内建方法,运算符重载)

    Python是一门独特的语言,力求简洁,它甚至不像某些语言(如Java)提供接口语法,Python语言采用的是"约定"规则,它提供了大量具有特殊意义的方法,这些方法有些可以直接使用 ...

  6. WPF中5种内建面板Canvas、StackPanel、WrapPanel、DockPanel、Grid分析

    Canvas.StackPanel.WrapPanel.DockPanel和Grid是WPF中主要的5种内建面板,这些面板类都位于System.Windows.Controls命名空间下. 主要布局特 ...

  7. Linux Shell 内建命令 : builtin 命令详解

    builtin命令用于执行指定的shell内部命令,并返回内部命令的返回值.builtin命令在使用时,将不能够再使用Linux中的外部命令.当系统中定义了与shell内部命令相同的函数时,使用bui ...

  8. 列举5个python内置函数_Python5个内建高阶函数的使用

    描述 本文结合各种实际的例子详细讲解了Python5个内建高阶函数的使用,能够帮助理解Python的数据结构和提高数据处理的效率,这5个函数分别是: map reduce filter sorted/ ...

  9. python中append函数合并列表且列表内数字从高到低_35个高级Python知识点总结

    No.1 一切皆对象 众所周知,Java中强调"一切皆对象",但是Python中的面向对象比Java更加彻底,因为Python中的类(class)也是对象,函数(function) ...

最新文章

  1. java ifpresent_java映射的merge、compute、computeIfAbsent、computeIfPresent的使用
  2. 最长公共子序列(稀疏序列)nlogn解法
  3. 2018年去贷款,是否可以不用找信贷经理帮忙?
  4. 陕西师范大学计算机科学学院保研院校,陕西师范大学计算机科学学院(专业学位)现代教育技术保研细则...
  5. 使用Kubespray部署生产可用的Kubernetes集群(1.11.2)
  6. 2016.08.15
  7. apache java cache-control,Tomcat: Cache-Control
  8. 什么是阿里云服务器系统盘和数据盘?
  9. 姿态估计4-02:voxelpose(多视角3D人体姿态估算)-官方数据训练测试,环境搭建等
  10. 2022年Java面试宝典【4万字带答案】
  11. MatConvNet训练自己的网络
  12. android 问题-----Please execute 'adb uninstall com.newland.securityclient' in a shell.
  13. Windows PE(WinPE)
  14. windows命令 format的用法
  15. 在数学的海洋中飘荡(转自Dahua的Blog)
  16. 学生Web开发人员练习:电影评论II
  17. ubuntu14.04安装Kile
  18. 《低代码指南100解决方案》——5疫情防控常态化之下,如何做好访客管理?
  19. c语言实现循环结构的语句有哪些?它们的区别是什么?,2011年04月份计算机软件基础(一)复习资料二...
  20. PyOpenGL报错OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for

热门文章

  1. 内存存储器和外存储器的异同
  2. windows创建定时任务执行python脚本
  3. 从状态模式看“大神”和“菜鸟”的差别
  4. jquery调用click事件的三种方式
  5. Activity生命周期回调是如何被回调的?
  6. c++ opencv 通过网络连接工业相机_OpenCV项目实战之零件缺陷检测(上)
  7. linux命令速查手册_值得收藏!Linux系统常用命令速查手册
  8. Android之工程目录介绍
  9. 【敏捷开发】从需求文档出发聊敏捷
  10. Android 之小技巧