2016-04-04 3 views
1

私は行SQL Serverのインポート行の文字列テーブルの列に

"[0,0,0,1,2,4,1,0,0,2,0,0,0,0,847,18207,0,0,0,0,0,0,0,0,0,0,0,0]" 

あたり以下のテキストを含むテーブルを持っている今、私は28 を含むテーブルにこれらの28個の値を挿入します。私はいくつかの分割関数を試しましたが、これらは行だけを返します。

アイデア?

+0

を使用してSQL Serverには、 "文字列配列" の概念がありません。データは実際にどのように格納されていますか? –

+0

as nvarchar(256) – phicon

+0

は、分割関数を使用し、その結果を動的にピボットします。 –

答えて

3

dbo.fnParseString()

INSERT INTO a_table (col1, col2, col3, . . .) 
SELECT dbo.fnParseString(-1, ',', str) 
     ,dbo.fnParseString(-2, ',', str) 
     ,dbo.fnParseString(-3, ',', str) 
     ,.... 
FROM yourtable 
+0

スプリッタは良いアプローチですが、参照したスプリッタはひどく非効率です。文字列を分割するためにループする必要はありません。 http://sqlperformance.com/2012/07/t-sql-queries/split-stringsまたはこちらをご覧ください。 http://www.sqlservercentral.com/articles/Tally+Table/72993/ –

+0

これらは、CSVを行に分割します。 OPは列 – Squirrel

+0

に必要です。しかし、そのためのループは必要ありません。クロス集計またはピボットを使用して列に戻すことができます。これは、XMLスプリッタにとって素晴らしい時間です。 –

1
DECLARE @x XML 

;with cte as (
SELECT '[0,0,0,1,2,4,1,0,0,2,0,0,0,0,847,18207,0,0,0,0,0,0,0,0,0,0,0,0]' as col 
) 

SELECT @x= (
SELECT CAST('<s>' + REPLACE(REPLACE(REPLACE(col,'[','<a>'),']','</a>'),',','</a><a>') +'</s>'AS XML) 
FROM cte 
FOR XML PATH('') 
) 


SELECT t.v.value('a[1]','int'), 
     t.v.value('a[2]','int'), 
     t.v.value('a[3]','int'), 
     ... 
     t.v.value('a[28]','int') 
FROM @x.nodes('/s') as t(v)