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。瞧,你的行是列!

在此处输入图像描述

在此处输入图像描述

对不起尺寸。我的视网膜是所有屏幕截图的两倍,除了使用不同的计算机之外,我还没有找到方便的解决方法。:-(


现在,如果您真的想在 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 回答