是否有一种方法可以将单个行输出到单个列中,原始列名称和值将交替出现?

时间:2015-10-16 10:09:23

标签: sql sql-server-2008 testing

我是白盒测试我们数据库上的一个宽表的单行(我们几乎每个大型开发都会这样做。)

因此我们通过主键进行简单的选择:

SELECT * FROM MYTAB WHERE MYKEY = 42;

这产生了大量的列(为了这个例子,让我们说26 - 请不要挂断数据,这纯粹是为了示例)。

Alpha . . . Zulu
-----       ----
237902      RABBIT

(1 row(s) affected)

是否有一种输出方式,以便每列获得它自己的输出所以:

Alpha
-----
237902

(1 row(s) affected)
.
.
.
Zulu
----
RABBIT

(1 row(s) affected)

或者每列被强制到下一行,所以:

Alpha
-----
237902
.
.
.
Zulu
----
RABBIT

(1 row(s) affected)

我正在使用SQL Server Management Studio。

1 个答案:

答案 0 :(得分:1)

使用动态SQL的强大功能:

<强> LiveDemo

CREATE TABLE #tab(
   ID   INTEGER  NOT NULL PRIMARY KEY 
  ,Name VARCHAR(7) NOT NULL
  ,Age INT NOT NULL);

INSERT INTO #tab(ID,Name, Age) VALUES (1,'John', 14), (2,'Jane', 23);
INSERT INTO #tab(ID,Name, Age) VALUES (3,'Joe', 34),  (4,'Jimmy', 54);

DECLARE 
  @col_name   NVARCHAR(128) = NULL,
  @table_name NVARCHAR(128) = '#tab',
  @counter    INT           = 1,
  @id         INT           = 1,
  @sql        NVARCHAR(MAX) = '';

SELECT COLUMN_NAME, ORDINAL_POSITION
INTO #columns
FROM tempdb.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE @table_name + '%';

WHILE @counter <= (SELECT COUNT(*) FROM #columns)
BEGIN

  SELECT @col_name = COLUMN_NAME
  FROM #columns
  WHERE ORDINAL_POSITION = @counter;

  SET @sql += 
  N'
  SELECT <col_name>
  FROM <table_name>
  WHERE ID = @id';

  SET @sql = REPLACE(@sql, '<col_name>', @col_name);
  SET @sql = REPLACE(@sql, '<table_name>', @table_name);

  SET @counter += 1;
END

EXEC [dbo].[sp_executesql]
      @sql
      ,N'@id INT'
      ,@id;

输出:

╔════╗
║ ID ║
╠════╣
║  1 ║
╚════╝

╔══════╗
║ Name ║
╠══════╣
║ John ║
╚══════╝

╔═════╗
║ Age ║
╠═════╣
║  14 ║
╚═════╝

警告:

示例表来自我之前的示例,但我希望您不要介意。