SQLSERVER用无中生有的思想来替代游标 SQLSERVER用无中生有的思想来替代游标 昨天在MSDN论坛看到一个帖子,帖子中LZ需要根据某列的值把其他列的值插入到额外列 帖子地址:http://social.technet.microsoft.com/Forums/zh-CN/3eac78ca-d071-4c00-afa0-ef48c8501745/sql-statementcolumn-namecolumnsql- 建表脚本: USE tempdbGO --建表CREATE TABLE…
通过MSSQL中的用户自定义表类型可以快速将需要处理的数据存储起来,生成新的临时表(这里使用变量表),然后根据表中字段进行批处理替代游标. 用户自定义表类型 0 --创建用户自定义表类型 1 Create Type [dbo].[type_XXXTable] As Table( ) Null, ) Null, ) Null, ) Null, ) Null, ) Null, ) Null, ) Null, ) Null, ) Null, [ItemInt1] [Int] Null, [ItemIn…
在编写SQL批处理或存储过程代码的过程中,经常会碰到有些业务逻辑的处理,需要对满足条件的数据记录逐行进行处理,这个时候,大家首先想到的方案大部分是用“游标”进行处理. 举个例子,在订单管理系统中,客服需要对订单日期为2012-09-01的销售订单进行某个批量操作,比如批量发货操作,后台业务逻辑处理时,需要对满足条件的订单记录进行逐行处理. 我首先是采用“游标”编写的业务逻辑存储过程,SQL代码可以如下: 游标 ) -- 声明局部游标:从订单数据表获取订单日期为2012-09-01,订单类型为Sa…
http://www.cnblogs.com/chongzi/archive/2011/01/19/1939106.html 临时表 存放在tempdb中 --存储过程中将多表连接结果写入到临时表中,然后通过游标查询临时表内容 --判断临时表是否存在 IF OBJECT_ID('tempdb..#TmpTable') IS NOT NULL DROP TABLE #TmpTable SELECT a.[a1],a.[a1],b.[b1],b.[b2] INTO #TmpTable FROM A…
本文转自:https://www.cnblogs.com/SunnyZhu/p/5719184.html By行处理数据,推荐2种方式: 1.游标 2.While循环 我们来了解下这两种方案处理1w行数据分别需要多长时间. 一.游标. 首先我们填充一个表,用优雅的递归方式填充. create table Orders(OrderID int,CostValue decimal(18,2) ) ;with cte_temp as ( select 1 as OrderID union all se…
By行处理数据,推荐2种方式: 1.游标 2.While循环 我们来了解下这两种方案处理1w行数据分别需要多长时间. 一.游标. 首先我们填充一个表,用优雅的递归方式填充. ,) ) ;with cte_temp as ( as OrderID union all ) insert into Orders(OrderID) ); 现在我们的订单表Orders有了一万条订单,但是CostValue还是NULL值. 我们用游标的方式给每一条订单添加一个CostValue,耗时44s. --游标 DE…
行级函数:下列行集函数将返回一个可用于代替 Transact-SQL 语句中表引用的对象. CONTAINSTABLE 返回具有零行.一行或多行的表,这些行的列中包含的基于字符类型的数据是单个词语和短语的完全匹配或模糊匹配(不完全相同)项.某个词在一定范围内的近似词或者加权匹配项.CONTAINSTABLE 可以像一个常规的表名称一样,在 SELECT 语句的 FROM 子句中引用.OPENQUERY 对给定的链接服务器执行指定的传递查询.该服务器是 OLE DB 数据源.OPENQUERY 可…
1.如果表没有自动增长的标识列(int) 使用临时表 SELECT IDENTITY(int) NewID ,.. INTO #tmp FROM YouTable 2.表有标识列 使用表变量 INSERT INTO @tmpTable SELECT ..., NewID=(SELECT COUNT(*) FROM YouTable b WHERE b.aid<=a.aid) FROM YouTable a 当有了从 1到~d 的连续NewID时, 你就可以用循环来操作每一条记录了.这个NewID…
1.如果表没有自动增长的标识列(int) 使用临时表 SELECT IDENTITY(int) NewID ,.. INTO #tmp FROM YouTable 2.表有标识列 使用表变量 INSERT INTO @tmpTable SELECT ..., NewID=(SELECT COUNT(*) FROM YouTable b WHERE b.aid<=a.aid) FROM YouTable a 当有了从 1到~d 的连续NewID时, 你就可以用循环来操作每一条记录了.这个NewID…
在很多场合,用临时表或表变量也可以替代游标 临时表用在表没有标识列(int)的情况下. 在表有标识列(int)的情况下可以用表变量,当然也可以用临时表. 利用临时表或表变量的原因时,生成一个连续的列 对于临时表是使用 SELECT .... ,IDENTITY(int) NewID INTO #tmp SELECT ... FROM YourTable 对于YourTable含有标识列(比如字段名为ID)时,可以 INSERT @tmpTable SELECT ..., NewID=(SELEC…