Sql server SQL Server:在这里使用游标是不可避免的吗?

Sql server SQL Server:在这里使用游标是不可避免的吗?,sql-server,split,cursor,Sql Server,Split,Cursor,我得到了一个表,其中只有一列类型为varchar(max),看起来像这样: COLUMN_A jon;jonny;johana jon fred;brian james;lars;cliff;kirk 现在我想拆分这些名称,并为每个名称创建一行,如: COLUMN_A jon jonny johana jon fred brian james lars cliff kirk …此时,我用光标调用拆分函数。您认为有更好、更高效的解决方案吗?在T-SQL中: Begin Transaction

我得到了一个表,其中只有一列类型为
varchar(max)
,看起来像这样:

COLUMN_A
jon;jonny;johana
jon
fred;brian
james;lars;cliff;kirk
现在我想拆分这些名称,并为每个名称创建一行,如:

COLUMN_A
jon
jonny
johana
jon
fred
brian
james
lars
cliff
kirk
…此时,我用光标调用拆分函数。您认为有更好、更高效的解决方案吗?

在T-SQL中:

Begin Transaction
While Exists (Select * From Table 
              where CharIndex(';', column_A) > 0)
    Begin
       Insert Table(column_A)
       Select Left(column_A, charIndex(';', column_A)-1)
       Where charIndex(';', column_A) > 0
       -- next 3 lines only if you want to avoid duplicates
       And Not exists (Select * From table 
                       Where column_A = Left(column_A, 
                         charIndex(';', column_A)-1))
       Update Table set column_A
          = substring(columnA, 1+charIndex(';', column_A), 
                    len(column_A) - charIndex(';', column_A))
       From table
       Where charIndex(';', column_A) > 0
    End
Commit Transaction
您还可以使用XML:

DECLARE @xml xml;
WITH cte AS (
SELECT * FROM (VALUES
('jon;jonny;johana'),
('jon'),
('fred;brian'),
('james;lars;cliff;kirk')) as t(COLUMN_A)
)

SELECT @xml = (
SELECT cast('<e>' + REPLACE(COLUMN_A,';','</e><e>') + '</e>' as xml)
FROM cte
FOR XML PATH(''))


SELECT n.v.value('.','nvarchar(50)') as COLUMN_A
FROM @xml.nodes('/e') AS n(v);

对大约有一打。你试过搜索吗?谢谢你的回答,查尔斯。最初的测试通过游标方法获得了更快的性能。我想,光标通常是一个相当慢的选择…不过谢谢你的帮助!
COLUMN_A
-----------
jon
jonny
johana
jon
fred
brian
james
lars
cliff
kirk

(10 row(s) affected)