#cursor分割列#

时间:2012-06-11 17:25:30

标签: sql sql-server sql-server-2008 tsql

我有一张桌子

WS_ID   WS_WEBPAGE_ID   WS_SPONSORS_ID  WS_STATUS   WS_CREATEDTS
2   3             2          N        2012-06-07 15:32:00
3   3        3           N              2012-06-07 15:37:00
4   3        4           Y             2012-06-07 15:41:00
5   1        1           Y              2012-06-07 16:05:00
6   2        1           Y              2012-06-07 16:05:00
7   2        4           Y             2012-06-07 16:05:00
8   4        1           Y             2012-06-07 16:05:00
9   1        3           Y             2012-06-07 16:05:00
10  1        2           Y             2012-06-07 16:05:00
11  1        4           Y             2012-06-07 16:05:00
12  2        3           Y             2012-06-07 16:05:00
13  2        3           Y             2012-06-07 16:05:00
14  2        1           Y             2012-06-07 16:05:00
24706   3             8,7,9,5,5     NULL          NULL

我写了一个游标并调用了该游标中的split函数来拆分最后一条记录

Declare @splitc varchar(250)
Declare splitcursor cursor for
select ws_sponsors_id from dbo.TBL_WD_SPONSORS 
open splitcursor
fetch next from splitcursor into @splitc
while(@@FETCH_STATUS = 0)
begin
  print '@splitcursor'

--select * from dbo.Comma_Split(@ws_sponsors_id,',')
select dbo.Comma_Split(ws_sponsors_id,',') from dbo.TBL_WD_SPONSORS where ws_id = 24706

--select * from dbo.TBL_WD_SPONSORS where WS_SPONSORS_ID in(select * from dbo.Comma_Split(ws_sponsors_id,','))

    fetch next from splitcursor into @splitc
  end
  close splitcursor
  deallocate splitcursor

我收到了错误

  

找不到列“dbo”或用户定义的函数或聚合“dbo.Comma_Split”,或者名称不明确。

 WS_ID  WS_WEBPAGE_ID  WS_SPONSORS_ID  WS_STATUS  WS_CREATEDTS


 24706    3              8,7,9,5,5        NULL     NULL

但我需要输出

WS_ID        WS_WEBPAGE_ID      WS_SPONSORS_ID       WS_STATUS      WS_CREATEDTS
24706             3                 8                  NULL           NULL
24707             3                 7                  NULL           NULL
24708             3                 9                  NULL           NULL
24709             3                 5                  NULL           NULL
24710             3                 5                  NULL           NULL

如何获得输出

帮帮我。

2 个答案:

答案 0 :(得分:0)

为什么不重新构建表,以便在WS_SPONSORS_ID列中只输入1个值,这样它就是外键关系,那么就不必执行这个分割功能。

答案 1 :(得分:0)

看起来您正在尝试使用的功能在您运行它的数据库上不存在。例如,试试这个,你会得到同样的错误:

SELECT dbo.This_Function_Most_Certainly_Doesnt_Exist('Unless you''re trying to break my example.') 

这将证明它是否存在,以便你不必接受我的话。在您运行基于游标的查询的数据库上运行此命令:

SELECT * FROM INFORMATION_SCHEMA.ROUTINES R WHERE R.ROUTINE_NAME = 'Comma_Split'

如果没有返回任何行,那是因为那里不存在该功能。要么你在错误的数据库上,错误的版本,你需要在它上面运行CREATE FUNCTION,或类似的东西。

编辑:顺便说一句,至于如何解决实际问题:不要使用游标。游标用作数据结果集上的迭代形式。在光标中,您要选择单行的值:

select dbo.Comma_Split(ws_sponsors_id,',') from dbo.TBL_WD_SPONSORS where ws_id = 24706

你拥有它的方式,你可以在该行上调用该函数,对表中的每一行调用一次。以下是拆分函数的一个很好的例子:http://praveenbattula.blogspot.com/2010/06/best-split-udf-function-with-delimeter.html

使用它你只需要写:

SELECT dbo.fnStringSplitter(ws_sponsors_id, ',') FROM dbo.TBL_WT_SPONSORS WHERE ws_id = 24706