基本上我希望能够获取此行值
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
答案 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。