日期:2014-05-17  浏览次数:20507 次

关于数据循环的一个问题最好不用游标,请大家帮忙解决一下啊。速度要快一点的
我的数据库是这样的:
id   field1
--------------
5       张三,2012-01-01
6       a,qer
7       b   kk
8       cdd
9       李四,2012-1-8
10       agr[fg0)
11       dhg
12       e3y
13       王五,2012-3-9
15       fhg
16       guy

现在要把日期插入到field1的每一行的开头,按照ID顺序进行。即结果如下
id   field1   field2
--------------
5       张三,     2012-01-01
6       a,qer       2012-01-01
7       b   kk       2012-01-01
8       cdd       2012-01-01
9       李四,2012-1-8
10       agr[fg0)       2012-1-8
11       dhg       2012-1-8
12       e3y       2012-1-8
13       王五,2012-3-9
15       fhg       2012-3-9
16       guy       2012-3-9

最好不用游标,请大家帮忙解决一下啊。速度要快一点的
------最佳解决方案--------------------
--> 测试数据:#tb
IF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL DROP TABLE #tb
GO
CREATE TABLE #tb([id] INT,[name] VARCHAR(50),[date] datetime)
INSERT #tb
SELECT 5,'张三,2012-01-01',NULL UNION ALL
SELECT 6,'a,qer',NULL UNION ALL
SELECT 7,'bkk',NULL UNION ALL
SELECT 8,'cdd',NULL UNION ALL
SELECT 9,'李四,2012-01-08',NULL UNION ALL
SELECT 10,'agr[fg0)',NULL UNION ALL
SELECT 11,'dhg',NULL UNION ALL
SELECT 12,'e3y',NULL UNION ALL
SELECT 13,'王五,2012-03-09',NULL UNION ALL
SELECT 15,'fhg',NULL UNION ALL
SELECT 16,'guy',NULL
GO

--> 测试语句:
;with cte as
(
  select *,[date1]=(case  when  charindex( ',',[name])> 0  
and isdate(stuff([name],1,charindex( ',',[name]), ''))=1
then stuff([name],1,charindex( ',',[name]), '') end )
  from #tb
)
update t set [date]=(select top 1 [date1] from cte where id<=t.id order by [date1] desc) 
from cte as t


select * from #tb
/*
id name date
5 张三,2012-01-01 2012-01-01 00:00:00.000
6 a,qer 2012-01-01 00:00:00.000
7 bkk 2012-01-01 00:00:00.000
8 cdd 2012-01-01 00:00:00.000
9 李四,2012-01-08 2012-01-08 00:00:00.000
10 agr[fg0) 2012-01-08 00:00:00.000
11 dhg 2012-01-08 00:00:00.000
12 e3y 2012-01-08 00:00:00.000
13 王五,2012-03-09 201