在分号上拆分字符串,然后循环结果

时间:2013-08-14 19:57:29

标签: sql-server-2005 split cursor

基本上我希望能够获取此行值

hello;my;apple;world;is;good

然后在行中选择一个。

但显然这个查询来自mytable中的select mycolumn;

  • 你好
  • 苹果
  • 世界

然后将其抛入游标循环

有没有办法用select;

来做到这一点
DECLARE
 TCursor CURSOR FOR
  //select split here?
OPEN TCursor  ;
FETCH NEXT FROM TCursor ;

WHILE @@FETCH_STATUS = 0
BEGIN
  FETCH NEXT FROM TCursor ;
END;

CLOSE TCursor  ;
DEALLOCATE TCursor ;
GO

1 个答案:

答案 0 :(得分:1)

只需创建一个拆分功能,例如(更新以处理尾随;,问题中未概述的方案):

CREATE FUNCTION dbo.SplitStrings_XML
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN 
   (  
      SELECT Item FROM
      ( 
        SELECT Item = RTRIM(y.i.value('.[1]', 'nvarchar(4000)'))
        FROM 
        ( 
          SELECT x = CONVERT(XML, '<i>' 
            + REPLACE(@List, @Delimiter, '</i><i>') 
            + '</i>').query('.')
        ) AS a CROSS APPLY x.nodes('i') AS y(i)
      ) AS x WHERE LEN(Item) > 0
   );
GO

然后你可以说以下任何一个:

--DECLARE TCursor LOCAL FAST_FORWARD FOR 

  SELECT Item FROM dbo.SplitStrings_XML('hello;my;apple;world;is;good', ';');
  SELECT Item FROM dbo.SplitStrings_XML('hello;my;apple;world;is;good;', ';');
  SELECT Item FROM dbo.SplitStrings_XML('apple;', ';');

我的猜测是你在这里并不需要光标,但是如果不知道你在循环中做了什么就很难提供指导。

顺便说一下,虽然这个XML函数作为一个独立的答案可以正常工作,但有better, more scalable solutions that take a little more effort