-1

type の列が 1 つしかないテーブルを取得しました。次の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

...現時点では、分割関数をカーソルで呼び出しています。そのためのより優れた、よりパフォーマンスの高いソリューションがあると思いますか?

4

2 に答える 2

1

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
于 2013-09-06T13:32:35.080 に答える
0

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)
于 2016-03-24T08:33:07.197 に答える