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

关于数据循环的一个问题最好不用游标,请大家帮忙解决一下啊。速度要快一点的
我的数据库是这样的:
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

最好不用游标,请大家帮忙解决一下啊。速度要快一点的
------解决方案--------------------
SELECT *,
  (SELECT TOP 1 STUFF(field1,1,CHARINDEX(field1,','),'')
 FROM TB WHERE field1 LIKE '%,%'  AND ISDATE(STUFF(field1,1,CHARINDEX(field1,','),'')
)  AND ID<T.ID ORDER BY ID DESC) AS field2 
FROM TB T
------解决方案--------------------
--> 测试数据:#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