2017-09-26 10 views
1

私はUSQLアレイ

SQL.ARRAY<SQL.ARRAY<string>> 

を返すアセンブリを持っている私は、正しい結果を得ていない、CSVにこれを平坦にする必要があります。ここで

は、私はその中に配列の配列を作成する場合には、U-SQLで次のようになります。

DECLARE @boardA1 SQL.ARRAY<string> = new SQL.ARRAY<string>{"111", "PASS", "0"}; 
DECLARE @boardA2 SQL.ARRAY<string> = new SQL.ARRAY<string>{"222", "PASS", "0"}; 
DECLARE @boardA3 SQL.ARRAY<string> = new SQL.ARRAY<string>{"333", "PASS", "0"}; 

@boards = 
    SELECT * 
    FROM(
     VALUES 
     (
      new SQL.ARRAY<SQL.ARRAY<string>>{@boardA1, @boardA2, @boardA3} 
     ) 
      ) AS t(boards); 

@result = 
    SELECT n.value AS Board 
    FROM @boards 
     CROSS APPLY 
      EXPLODE(boards) AS c(value) 
     CROSS APPLY 
      EXPLODE(c.value) AS n(value); 


OUTPUT @result 
TO "result1.csv" 
USING Outputters.Csv(); 

私はこの出力を得る:

"111" 
"PASS" 
"0" 
"222" 
"PASS" 
"0" 
"333" 
"PASS" 
"0" 

が、私はこの出力をしたいです:

"111","PASS","0" 
"222","PASS","0" 
"333","PASS","0" 

私は間違っていますか?すべての入力が評価されました!

+0

テストデータを観察するだけで、配列の各「列」は同じ構造であり、実際には行になるはずです。それはあなたのサンプルデータの人工物ですか? – wBob

答えて

1

@result2 = SELECT "\"" + string.Join(",", c.board).Replace(",", "\",\"") + "\"" AS Boards FROM @boards CROSS APPLY EXPLODE(boards) AS c(board);

OUTPUT @result2 TO "result2.csv" USING Outputters.Csv(quoting: false);

のことができます。このアプローチでは、私は、これはあなたがしたい配列の順序を使用して行うだろうExplode (U-SQL)

+0

私はそれを以前に試みましたが、コンマで区切られた文字列ではなくカンマ区切りの値で1つの文字列を作成します。これは、この "111"、 "PASS"、 "0"の代わりに "111、PASS、0" – Anders

0

から例えば

@result = 
    SELECT 
     x.board[0] AS a, 
     x.board[1] AS b, 
     x.board[2] AS c   
    FROM @boards 
     CROSS APPLY 
      EXPLODE(boards) AS x(board); 

ARRAY<ARRAY<string>>下の例を参照してください。明示的に列名を指定し、quotingはexpとして動作します影響を受けた。このアプローチの欠点は、アレイ内にいくつの「列」があるかを知る必要があることです。