定义表变量是可以直接操作在内存中的数据,比较快。临时表在大数据量时会比游标使用的资源少。还是要看具体情况了。也有可能在实际优化过程中相互替换呢。

留作记忆的代码如下:

  1. if object_id('tempdb..#Tmp') is not null
  2. Begin
  3. drop table #Tmp
  4. End
  5.  
  6. create table #Tmp --创建临时表#Tmp为获取远程设备信息使用
  7. (
  8. deviceId varchar(50),
  9. deviceNo varchar(200),
  10. FlagID TINYINT
  11. );
  12. declare @i int,--执行一条sql语句的临时变量,用于远程数据库配置信息循环
  13. @j int,--执行一条sql语句的临时变量,用于更新设备信息名称
  14. @user varchar(50),--用户名
  15. @password varchar(100),--密码
  16. @ssid varchar(100),--ssid
  17. @db varchar(100),--数据库名称
  18. @server varchar(100),--远程数据库server
  19. @database varchar(200),
  20. @remoteid int
  21. --定义远程数据库配置信息临时表
  22. declare @tRemoteOffice table
  23. (
  24. RemoteId int,
  25. RomoteUser varchar(50),
  26. RemotePassword varchar(100),
  27. RemoteSsid varchar(100),
  28. RemoteDb varchar(100),
  29. RemoteName varchar(100),
  30. FlagID TINYINT
  31. )
  32.  
  33. begin
  34.  
  35. BEGIN TRY---------------------开始捕捉异常
  36.  
  37. --1.查询远程数据库配置表,插入查询数据到临时表
  38. insert @tRemoteOffice select remote_id, remote_user,remote_psw,remote_ssid,remote_database,remote_name,0 from dbo.RemoteDBInfo;
  39. print CONVERT(varchar(100), GETDATE(),21)+'插入远程数据库配置信息到临时表,一共执行'+convert(varchar(5),@@ROWCOUNT)+'条'
  40.  
  41. set @i=1;
  42. --Return_connectError:
  43. while(@i>=1)
  44. begin
  45. Return_begin:
  46. --2.选取临时表里的一条数据
  47. SELECT TOP 1 @remoteid=RemoteId, @user = RomoteUser,@password=RemotePassword,@ssid=RemoteSsid,@db=RemoteDb,@server=RemoteName FROM @tRemoteOffice WHERE FlagID=0;
  48. SET @i=@@ROWCOUNT
  49. IF @i<=0 GOTO Return_Lab
  50. print '开始连接远程数据库,ssid:'+@ssid;
  51. begin try
  52. --3.连接远程数据库
  53. exec sp_addlinkedserver @server, ' ', 'SQLOLEDB', @ssid ;
  54. exec sp_addlinkedsrvlogin @server, 'false ',null, @user, @password ;
  55.  
  56. select @database=@server+'.'+@db;
  57. --4.查询远程数据库的机构信息
  58. declare @officeID nvarchar(50),
  59. @officeName nvarchar(200)
  60.  
  61. declare @searchRemoteOfficeSql Nvarchar(max)=N'SELECT @Id=office_id,@Name=office_name FROM '+@database+'.dbo.Office where caste=0';
  62. Exec sp_executesql @searchRemoteOfficeSql,N'@Id nvarchar(50) output,@Name nvarchar(100) output',@officeID output,@officeName output;
  63.  
  64. print CONVERT(varchar(100), GETDATE(),21)+'查询远程数据库机构信息,一共执行'+convert(varchar(5),@@ROWCOUNT)+'条'
  65. update dbo.RemoteDBInfo set remote_type=1 WHERE remote_ssid = @ssid ;
  66. end try
  67. begin catch
  68. print '连接远程数据库'+@ssid+'异常'
  69. exec sp_dropserver @server, 'droplogins ';
  70. UPDATE @tRemoteOffice SET FlagID=1 WHERE RemoteSsid = @ssid;
  71. update dbo.RemoteDBInfo set remote_type=0 WHERE remote_ssid = @ssid ;
  72. goto Return_begin
  73. end catch
  74. --5.查询已连接的远程数据库officeid是否已在本地表中
  75. declare @SearchLocalUnitySql Nvarchar(max)=N'select UnityId from dbo.Unity where UnityId =@Id ';
  76. Exec sp_executesql @SearchLocalUnitySql,N'@Id nvarchar(50)',@Id=@officeID;
  77.  
  78. --6.不在本地表中,插入新的机构信息
  79. if @@ROWCOUNT=0
  80. begin
  81.  
  82. declare @InsertUnityOfficeSql Nvarchar(max)=N'insert into dbo.Unity (UnityId,Name,ParentId,Type,remote_id) values(@id,@name,NULL,0,@remote_id) ';
  83. Exec sp_executesql @InsertUnityOfficeSql,N'@id nvarchar(50),@name nvarchar(200),@remote_id int',@id=@officeID,@name=@officeName,@remote_id=@remoteid;
  84. print CONVERT(varchar(100), GETDATE(),21)+'插入新的机构信息,一共执行'+convert(varchar(5),@@ROWCOUNT)+'条'
  85. end
  86. --7.在本地表中,更新机构名称
  87. else
  88. begin
  89. declare @UpdateUnityOfficeNameSql Nvarchar(max)=N'update dbo.Unity set Name=@Name1,remote_id=@remote_id where UnityId=@Id1 ';
  90. Exec sp_executesql @UpdateUnityOfficeNameSql,N'@Name1 nvarchar(100),@Id1 nvarchar(50),@remote_id int',@Name1=@officeName,@Id1=@officeID,@remote_id=@remoteid;
  91. print CONVERT(varchar(100), GETDATE(),21)+'更新机构信息,一共执行'+convert(varchar(5),@@ROWCOUNT)+'条'
  92. end
  93.  
  94. --8.插入设备信息到临时表
  95. truncate table #Tmp
  96. declare @deviceID varchar(50),
  97. @deviceName varchar(200)
  98.  
  99. declare @InsertRemoteDeviceSql Nvarchar(max)=N'insert #Tmp select device_id,device_no,0 FROM '+@server+'.'+@db+'.dbo.device where parent_id is null and is_bom=0 and status=1 ';
  100. Exec sp_executesql @InsertRemoteDeviceSql;
  101. print CONVERT(varchar(100), GETDATE(),21)+'插入设备信息到临时表,一共执行'+convert(varchar(5),@@ROWCOUNT)+'条'
  102. set @j=1;
  103. while(@j>=1)
  104. begin
  105. --9.选取临时表里的一条数据
  106. SELECT TOP 1 @deviceID = deviceId,@deviceName=deviceNo FROM #Tmp WHERE FlagID=0;
  107. SET @j=@@ROWCOUNT
  108. IF @j<=0 GOTO Return_device
  109. --10.查询临时表里的deviceId是否在Unity
  110. declare @SearchLocalUnityDeviceSql Nvarchar(max)=N'select UnityId from dbo.Unity where UnityId =@id ';
  111. Exec sp_executesql @SearchLocalUnityDeviceSql,N'@id nvarchar(50)',@id=@deviceID;
  112. --@@ROWCOUNT被执行一次后清零
  113. --print CONVERT(varchar(100), GETDATE(),21)+'查询临时表里的设备id是否在Unity里,一共执行'+convert(varchar(5),@@ROWCOUNT)+'条'
  114. --11.不在表数据里,插入新的设备信息
  115. if @@ROWCOUNT=0
  116. begin
  117.  
  118. declare @InsertUnityDeviceSql Nvarchar(max)=N'insert into dbo.Unity (UnityId,Name,ParentId,Type) values (@id,@name,@parentid,1) ';
  119. Exec sp_executesql @InsertUnityDeviceSql,N'@id nvarchar(50),@name nvarchar(200),@parentid nvarchar(50)',@id=@deviceID,@name=@deviceName,@parentid=@officeID;
  120. print CONVERT(varchar(100), GETDATE(),21)+'插入新的设备信息,一共执行'+convert(varchar(5),@@ROWCOUNT)+'条'
  121. end
  122. --12.在表数据里,更新设备名称
  123. else
  124. begin
  125. declare @UpdateUnityDeviceNameSql Nvarchar(max)=N'update dbo.Unity set Name=@name where UnityId=@id ';
  126. Exec sp_executesql @UpdateUnityDeviceNameSql,N'@name nvarchar(200),@id nvarchar(50)',@name=@deviceName,@id=@deviceID;
  127. print CONVERT(varchar(100), GETDATE(),21)+'更新设备名称,一共执行'+convert(varchar(5),@@ROWCOUNT)+'条'
  128. end
  129.  
  130. --13.获取本地FireReport表的最新数据时间
  131. declare @fireReportTime DateTime
  132. declare @SearchFireReportTime Nvarchar(max)=N'SELECT top 1 @time=FindTime FROM dbo.FireReport where UnityId=@id order by FindTime desc';
  133. Exec sp_executesql @SearchFireReportTime,N'@time Datetime output,@id nvarchar(50)',@fireReportTime output,@id=@deviceID;
  134. --14.插入火情信息数据
  135. if @fireReportTime=null
  136. begin
  137. set @fireReportTime=GETDATE();
  138. end
  139.  
  140. --0 未处理,1确认,2误报,3取消,4上报,5未知状态
  141. declare @InsertFireSql Nvarchar(max)=N'insert into dbo.FireReport(FindTime,FireType,UnityId)
  142. select raised_dt
  143. ,CASE WHEN confirmed = 0 and cancelled=0 and discarded=0 and reported=0 THEN 0
  144. WHEN confirmed = 1 and cancelled=0 and discarded=0 and reported=0 THEN 1
  145. WHEN confirmed = 0 and cancelled=0 and discarded=1 and reported=0 THEN 2
  146. WHEN confirmed = 0 and cancelled=3 and discarded=0 and reported=0 THEN 3
  147. WHEN confirmed = 0 and cancelled=0 and discarded=0 and reported=4 THEN 4
  148. ELSE 5 END,@id FROM '+@server+'.'+@db+'.dbo.fire where raised_dt>@time and tower_id=@id order by raised_dt desc';
  149. Exec sp_executesql @InsertFireSql,N'@id nvarchar(50),@time DateTime',@id=@deviceID,@time=@fireReportTime;
  150. print CONVERT(varchar(100), GETDATE(),21)+'.插入火情信息数据,一共执行'+convert(varchar(5),@@ROWCOUNT)+'条'
  151.  
  152. --15.插入设备状态数据
  153. --首先判断在视图中是否存在设备运行状态
  154. declare @SearchViewSql Nvarchar(max)=N'SELECT tower_id FROM '+@server+'.'+@db+'.dbo.vw_cruise_state where tower_id=@id ';
  155. Exec sp_executesql @SearchViewSql,N'@id nvarchar(50)',@id=@deviceID;
  156. if @@ROWCOUNT>0
  157. begin
  158. declare @InsertDeviceStatusSql Nvarchar(max)=N'Insert into dbo.DeviceStatus(UnityID,GetTime,Status) SELECT tower_id,GETDATE(),aa_status FROM '+@server+'.'+@db+'.dbo.vw_cruise_state where tower_id=@id ';
  159. Exec sp_executesql @InsertDeviceStatusSql,N'@id nvarchar(50)',@id=@deviceID;
  160. print CONVERT(varchar(100), GETDATE(),21)+'插入设备运行状态数据,一共执行'+convert(varchar(5),@@ROWCOUNT)+'条';
  161. print CONVERT(varchar(100), GETDATE(),21)+'设备ID为:'+@deviceID;
  162. end
  163.  
  164. IF @@error=0
  165. UPDATE #Tmp SET FlagID=1 WHERE deviceId = @deviceID
  166.  
  167. Return_device:
  168. end
  169. truncate table #Tmp;
  170.  
  171. exec sp_dropserver @server, 'droplogins ';
  172. IF @@error=0
  173. UPDATE @tRemoteOffice SET FlagID=1 WHERE RemoteSsid = @ssid
  174.  
  175. Return_Lab:
  176. end
  177. DROP TABLE [dbo].#Tmp
  178.  
  179. END TRY-----------结束捕捉异常
  180.  
  181. BEGIN CATCH------------有异常被捕获
  182. print @@error;
  183. --IF @@TRANCOUNT > 0---------------判断有没有事务
  184. --BEGIN
  185. -- ROLLBACK TRAN----------回滚事务
  186. --END
  187. print ERROR_MESSAGE();
  188. UPDATE @tRemoteOffice SET FlagID=1 WHERE RemoteSsid = @ssid;
  189. exec sp_dropserver @server, 'droplogins '; -----------执行存储过程将错误信息记录在表当中
  190. END CATCH--------结束异常处理
  191.  
  192. end

存储过程使用表变量或临时表代替游标Fetch实例,访问远程数据库的更多相关文章

  1. MYSQL 存储过程、函数、临时表、游标

    创建函数 因为我们平时经常需要创建不同日期的数据,以模拟的场景,覆盖更多的用例,所以这里写了一个返回随机日期的demo.大家可以自行扩展. DROP FUNCTION IF EXISTS milan_ ...

  2. sqlserver 表循环-游标、表变量、临时表

    SQL Server遍历表的几种方法 阅读目录 使用游标 使用表变量 使用临时表 在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易 ...

  3. SQL表变量与临时表区别 + 非游标临时表遍历

    SQL表变量与临时表区别 + 非游标临时表遍历 分类: SQL Server2009-11-27 17:01 1196人阅读 评论(2) 收藏 举报 sqlinsert存储sql servermicr ...

  4. sql server 存储过程中使用变量表,临时表的分析(续)

    最近,我有一朋友,对我说他的数据库中的很多存储过程,执行都是超时.让我替他看看是什么原因.我一看,原来他的存储过程中用了很多的临时表与变量表.于是我跟他说过犹不及. 在存储过程中使用临时表或变量表,使 ...

  5. SQL知识整理一:触发器、存储过程、表变量、临时表

    触发器 触发器的基础知识 create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,] ...

  6. SQL Server存储过程和游标有关实例以及相关网址

    内含游标的存储过程实例 第一种写法 GO BEGIN IF (object_id('PT_FAULT_REPORT', 'P') is not null) drop proc PT_FAULT_REP ...

  7. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  8. SQL Server 表变量和临时表的区别

    SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...

  9. SqlServer之表变量和临时表

    表变量: 表变量创建的语法类似于临时表,区别就在于创建的时候,必须要为之命名.表变量是变量的一种, 表变量也分为本地及全局的两种,本地表变量的名称都是以"@"为前缀,只有在本地当前 ...

随机推荐

  1. php 序列化储存和转化 json_encode() json_decode($q,true)

    序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 例如:当需要数据库只有一个 ...

  2. sqlalchemy操作Mysql

    SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”.SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合:而对象集合的抽象又 ...

  3. NPAPI火狐插件VS2013开发示例

    NPAPI火狐插件VS2013开发示例 下面是我根据网上开发示例自己做的一个demo,并提供代码下载. 开发环境 Windows 8.1 x64 Visual studio 2013 准备工作 首先需 ...

  4. nodejs应用mysql(纯属翻译)

    原文点击这里 目录 Install Introduction Contributors Sponsors Community Establishing connections Connection o ...

  5. sql server高效分页控件及c#调用实例

    第一.首先在sqlserver中创建一个存储过程 USE [BZY] GO /****** 对象: StoredProcedure [dbo].[up_ProcCustomPage2005_New] ...

  6. Swift UI

    概述 Apple近日发布了Swift编程语言,Swift是供iOS和OS X应用编程的新编程语言.相信很多开发者都在学习这门新语言.   废话不多说,下面我就来学习使用Swift创建一个简单的UI应用 ...

  7. #include<iostream>与#include<iostream.h>的区别

                                           转载于祝长洋的BLOG:http://blog.sina.com.cn/s/blog_514b5f600100ayks.h ...

  8. 关于cookie, iphone及chrome的异同

    http://www.blogjava.net/jjshcc/archive/2010/06/13/323517.html http://stackoverflow.com/questions/295 ...

  9. 单片机(MCU)使用常用名字解释

    总线:指能为多个部件服务的信息传送线,在微机系统中各个部件通过总线相互通信. 地址总线(AB):地址总线是单向的,用于传送地址信息.地址总线的宽度为16位,因此基外部存储器直接寻址64K,16位地址总 ...

  10. How to find friends

    How to find friends 思路简单,编码不易 1 def check_connection(network, first, second): 2 link_dictionary = di ...