0

このデータをフラット ファイル ソースから SQL Server にインポートしました。

B  01  1007282   Y  1001201 15102
B  02  LEVEL     Y  2705201 15102
B  03  1998014   Y  2808201 15102
B  05            Y  2808201 15102
B  06  49081100  Y  1708201 15102
B  07  64072151  Y  2903201 15102
B  08  75090350  Y  0111200 15102
B  09  58082950  Y  0608200 15102
B  10  75112551  Y  1007200 15102
B  11  72030950  Y  1007200 15102
B  20  74507632  Y  2808201 15102
B  23  98240166  Y  2808201 15102
B  25  U4507632  Y  2808201 15102
B  26  45002267  Y  2808201 15102

このデータから、各行を取得し、それぞれを別の列に分割する必要があります。

Column 1 : B  01  1007282   Y  1001201 15102
Column 2 : B  02  LEVEL     Y  2705201 15102
... 
4

1 に答える 1

1

この回答は、さらなる要件によっては時代遅れになる可能性がありますが、これまでのコメントを考えると、垂直ではなく水平にレビューするためだけに SQL Server のデータを変更しないことをお勧めします。Excel などのアプリケーションは、これにはるかに適しています。Management Studio からのクエリ結果をコピーして貼り付ける (グリッドへの結果)、ソース フラット ファイルからコピーして貼り付ける、またはデータを列として Excel に取得することができます。200行を強調表示し、 を押しCopyてから、どこかを右クリックして、Paste Special...ここにダイアログが表示されることを選択し、Transposeチェックボックスをオンにして をクリックしますOK。ほら、あなたの行は列です!

ここに画像の説明を入力

ここに画像の説明を入力

サイズはごめんなさい。私の網膜はすべてのスクリーン ショットのサイズを 2 倍にします。別のコンピュータを使用する以外に便利な回避策はまだ見つかりません。:-(


さて、本当に SQL Server でこれを行いたい場合は、このような醜いことを行うことができると思います。次のソース テーブルが与えられた場合 (SQL Server 2008 以降を想定):

CREATE TABLE dbo.InColumns(col VARCHAR(255));
GO

INSERT dbo.InColumns(col) VALUES
('B  01  1007282   Y  1001201 15102'),
('B  02  LEVEL     Y  2705201 15102'),
('B  03  1998014   Y  2808201 15102'),
('B  05            Y  2808201 15102'),
('B  06  49081100  Y  1708201 15102'),
('B  07  64072151  Y  2903201 15102'),
('B  08  75090350  Y  0111200 15102'),
('B  09  58082950  Y  0608200 15102'),
('B  10  75112551  Y  1007200 15102'),
('B  11  72030950  Y  1007200 15102'),
('B  20  74507632  Y  2808201 15102'),
('B  23  98240166  Y  2808201 15102'),
('B  25  U4507632  Y  2808201 15102'),
('B  26  45002267  Y  2808201 15102');

さて、とても楽しい動的 SQL です。

DECLARE @sql NVARCHAR(MAX) = N'', @maxlen INT;

SELECT @maxlen = MAX(LEN(col)) FROM dbo.InColumns;

SELECT @sql += N',
    Col' + RTRIM(rn) + ' VARCHAR(' + RTRIM(@maxlen) + ')'
 FROM (SELECT rn = ROW_NUMBER() OVER 
  (ORDER BY col) FROM dbo.InColumns) AS x;

SET @sql = N'CREATE TABLE dbo.InRows
(' + STUFF(@sql, 1, 1, N'') + ');';

EXEC sp_executesql @sql;

SET @sql = N'';

SELECT @sql += N', 
  (SELECT col FROM x WHERE rn = ' + RTRIM(rn) + ')'
  FROM (SELECT rn = ROW_NUMBER() 
    OVER (ORDER BY col) FROM dbo.InColumns) AS x;

SET @sql = N';WITH x AS (SELECT col, rn = ROW_NUMBER() OVER 
   (ORDER BY col) FROM dbo.InColumns)
INSERT dbo.InRows SELECT TOP (1) '
  + STUFF(@sql, 1, 1, N'') + ' FROM x;';

EXEC sp_executesql @sql;
GO
SELECT * FROM dbo.InRows;
GO
DROP TABLE dbo.InRows;

結果:

Col1                               Col2   ...
---------------------------------  -------------------------
B  01  1007282   Y  1001201 15102  B  02  LEVEL     Y  27...

これが Excel ではるかに簡単である理由がわかりますか?

200 行では、危険なほどテーブルの最大行サイズを超えようとしています。この 200varchar(max)列を作成することでそれを「修正」することはできますが、そのことを考えると実際に身震いがしました。

于 2013-03-09T17:53:32.853 に答える