1

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

hello;my;apple;world;is;good

然后在行中获得一个选择。

但显然这个查询来自于从 mytable 中选择 mycolumn;

  • 你好
  • 我的
  • 苹果
  • 世界
  • 好的

然后将其放入游标循环中

有没有办法通过选择来做到这一点?

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
4

1 回答 1

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 函数作为一个独立的答案可以很好地工作,但还有更好、更具可扩展性的解决方案需要更多的努力

于 2013-08-14T20:33:42.677 回答